📅  最后修改于: 2023-12-03 15:31:38.933000             🧑  作者: Mango
在 JavaScript 中,WeakMap
是一种可以存储弱引用键值对的数据结构。与 Map
(普通映射)不同, 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
的键。下面这个例子中尝试使用非对象作为键时,会引发 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
方法和 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
了。