📜  JavaScript WeakMap 完整参考(1)

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

JavaScript WeakMap 完整参考

在 JavaScript 中,WeakMap 是一种可以存储弱引用键值对的数据结构。与 Map(普通映射)不同, WeakMap 中的键必须是对象。 WeakMap 的键是弱引用的,当对象作为键所引用的对象不存在时,该键也会被自动从 WeakMap 中删除。

创建 WeakMap

创建一个新的 WeakMap 实例十分简单,只需使用 new 操作符并且没有参数即可:

const myWeakMap = new WeakMap();
添加、获取和删除键值对
const myWeakMap = new WeakMap();

const someObj = {};

myWeakMap.set(someObj, 'Hello, World!');

console.log(myWeakMap.get(someObj)); // 输出: Hello, World!

myWeakMap.delete(someObj);

console.log(myWeakMap.get(someObj)); // 输出: undefined
WeakMap 键必须是对象

WeakMap 存储了对象的引用,所以只有对象才能被用作 WeakMap 的键。下面这个例子中尝试使用非对象作为键时,会引发 TypeError

const myWeakMap = new WeakMap();

myWeakMap.set('stringKey', 'Hello, World!'); // TypeError:Invalid value used as weak map key
myWeakMap.set(42, 'Hello, World!'); // TypeError:Invalid value used as weak map key
WeakMap 中的键是弱引用的

WeakMap 存储的键不会妨碍被引用它们的对象被垃圾收集器回收。换句话说,当一个对象与它的键之间的唯一联系是 WeakMap 时,该对象可能被垃圾收集并释放内存。

WeakMap 方法

WeakMap 方法和 Map 非常相似:

  • set(key, value):将键和值添加到WeakMap,并返回WeakMap本身。
  • get(key):返回与给定键关联的值。如果WeakMap中没有与该键关联的值,则返回undefined。
  • has(key):返回 WeakMap 中是否存在与给定键关联的值。
  • delete(key):从 WeakMap 中删除与给定键关联的条目。其返回值表示假如与该键相对应的值存在,则 WeakMap 中已存在该条目并被删除,返回 true;如果删除操作失败,返回 false
  • clear():从 WeakMap 中删除所有条目。
示例

下面的代码展示了 WeakMap 的一些应用:

const myWeakMap = new WeakMap();

const key1 = {};
const key2 = {};
const key3 = {};

myWeakMap.set(key1, 'Value associated with key1');
myWeakMap.set(key2, 'Value associated with key2');
myWeakMap.set(key3, {color: 'blue'});

console.log(myWeakMap.get(key1)); // 输出: 'Value associated with key1'
console.log(myWeakMap.has(key2)); // 输出: true

myWeakMap.delete(key2);

console.log(myWeakMap.has(key2)); // 输出: false
总结

WeakMap 是一个优秀的用于存储对象和相关数据的数据结构,常常与 Map 一同使用。需要注意的是,因为 WeakMap 中的键是弱引用的,所以您不能在键不存在时引用它们。在您的代码中遵循这些规则,就可以成功地使用 WeakMap 了。