JavaScript Guidebook

JavaScript 完全知识体系

WeakMap

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

语法

new WeakMap([iterable]);

参数 iterable 是一个数组或者其他可迭代的且元素是键值对的对象。每个键值对会被加到新的 WeakMap 里。null 会被当做 undefiend

特征

对象键名

const map = new WeakMap();
map.set(1, 2);
// TypeError: Invalid value used as weak map key
map.set(null, 2);
// TypeError: Invalid value used as weak map key

弱引用对象

WeakMaps hold "weak" references to key objects

翻译过来应该是 WeakMap 保持了对键名所引用的对象的弱引用

这个弱引用的特性,就是 WeakMap 保持了对键名所引用的对象的弱引用,即 垃圾回收机制 不将该引用考虑在内。只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。

也正是因为这样的特性,WeakMap 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakMap 不可遍历。

所以 WeakMap 不像 Map,一是没有遍历操作(即没有 keys()values()entries() 方法),也没有 size 属性,也不支持 clear 方法,所以 WeakMap 只有四个方法可用:get()set()has()delete()

特征详细分析请参阅 📝 ES6 系列之 WeakMap

实例方法

方法说明
WeakMap.prototype.delete(key)移除 key 的关联对象
WeakMap.prototype.get(key)返回 key 的关联对象或 undefined
WeakMap.prototype.has(key)判定是否有指定 key 关联对象爱哪个
WeakMap.prototype.set(key)设置一组 key 关联对象

使用示例

const x = new WeakMap();
const y = new WeakMap();
const a = {};
const b = function () {};
const c = window;
x.set(a, 100);
x.set(b, 'BINGO!');
y.set(a, b);
y.set(c, undefined);
y.set(x, y);
x.get(b);
// 'BINGO!'
y.get(b);
// undefined
y.get(c);
// undefined
x.has(b);
// true
y.has(b);
// false
y.has(c);
// true
// delete()
x.has(a);
// true
x.delete(a);
x.has(a);
// false

参考资料: