WeakMap
键值对
- 其键必须是对象(弱引用),而值可以是任意的
- 原始数据类型 是不能作为 key 的(比如 Symbol)
弱引用
- 在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用
- 一个对象若只被弱引用所引用,则被认为是不可访问(或弱可访问)的,并因此可能在任何时刻被回收
弱引用垃圾回收
const wk = new WeakMap();
let key = new Array(5 * 1024 * 1024);
wl.set(key, 1);
key = null;
强引用垃圾回收
let map = new Map();
let key = new Array(5 * 1024 * 1024);
map.set(key, 1);
key = null;
map.delete(key);
key = null;
自动垃圾回收
- WeakMap 可以帮你省掉手动删除与多个对象关联数据的步骤,所以当你不能或者不想控制关联数据的生命周期时就可以考虑使用 WeakMap。
- 只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
不可遍历
- WeakMap内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakMap 不可遍历。
- 故只有这四个方法:
let wk=new WeakMap()
wk.get()
wk.set()
wk.has()
wk.delete()
WeakSet
集合
不可枚举
- WeakSet 中没有存储当前对象的列表。正因为这样,WeakSet 是不可枚举的
弱引用
- 集合中对象的引用为弱引用。如果没有其它的对 WeakSet 中对象的引用,那么这些对象会被当成垃圾回收掉。
WeakRef
- 处理弱引用的底层机制, 它可以将任何对象包装成弱引用,而不会阻止对象被 GC 回收
class AnyClass {
constructor(name) {
this.name = name;
}
}
const obj = new AnyClass('Some Name');
const weakRef = new WeakRef(obj);
const derefObj = weakRef.deref();
console.log(derefObj);
回收时机
返回弱引用的原始对象
- 如果该 target 对象已被 GC 回收则返回 undefined
WeakRef.prototype.deref()