📜  JavaScript WeakMap(1)

📅  最后修改于: 2023-12-03 15:31:38.981000             🧑  作者: Mango

JavaScript WeakMap

JavaScript WeakMap是ES6引入的新特性之一,它是一种弱引用的map结构,使用键值对存储数据,但是键只能是对象类型。WeakMap中的键没有被引用时,可以被垃圾回收机制回收,从而避免了内存泄漏的问题。

创建WeakMap

可以通过以下两种方式来创建WeakMap:

1.使用new关键字创建
const myWeakMap = new WeakMap();
2.使用可迭代对象创建
const myObject = {
  name: "Alice",
  age: 30
};
const myWeakMap = new WeakMap([[myObject, "someValue"]]);
WeakMap的方法

WeakMap仅有以下方法:

1.set(key, value)

在WeakMap中添加一条键值对,其中key只能是对象类型。

const myWeakMap = new WeakMap();
const myObject = {};
myWeakMap.set(myObject, "someValue");
2.get(key)

获取key对应的值。

const myWeakMap = new WeakMap();
const myObject = {};
myWeakMap.set(myObject, "someValue");
myWeakMap.get(myObject); // "someValue"
3.has(key)

判断WeakMap中是否有指定的key。

const myWeakMap = new WeakMap();
const myObject = {};
myWeakMap.set(myObject, "someValue");
myWeakMap.has(myObject); // true
4.delete(key)

删除指定的key所对应的键值对。

const myWeakMap = new WeakMap();
const myObject = {};
myWeakMap.set(myObject, "someValue");
myWeakMap.delete(myObject);
使用场景

WeakMap常被用于需要缓存某些对象的场景,比如缓存DOM节点。

由于DOM节点可能被删除,因此可以使用WeakMap将其缓存,避免内存泄漏。

const elementCache = new WeakMap();
function getElement(selector) {
  if (elementCache.has(selector)) {
    return elementCache.get(selector);
  }
  const element = document.querySelector(selector);
  elementCache.set(selector, element); // 缓存DOM节点
  return element;
}
注意事项

由于WeakMap中的键是弱引用,存在回收的可能性,因此不能像普通Map那样使用for...of遍历WeakMap。

另外,键只能是对象类型,且不能直接获取WeakMap的大小。

结论

JavaScript WeakMap是一种弱引用的map结构,可以避免内存泄漏的问题,常被用于缓存某些对象的场景。但是需要注意其语法上的限制和注意事项。