ES6 新增的弱集合(WeakSet),是 Set 的兄弟,API 也是 Set 的子集,描述的是 js 垃圾回收程序对待弱集合中的值的方式 WeakSet 和 WeakMap 都有点相似,比如 WeakMap 的键只能是 Object 或者继承 Object 的类型,尝试使用非对象设置值都会抛出 TypeError
思维导图
WeakSet 的特性
原子特性,值为对象类型
const ws = new WeakSet();
const val1 = { id: 1 },
val2 = { id: 2 },
val3 = { id: 3 };
// 可迭代对象的每个值都会按照迭代顺序插入到新实例中
const ws2 = new WeakSet([val1, val2, val3]);
log(ws2.has(val1)); // log: true
// WeakSet 是事务性操作的,一旦传递的迭代对象中存在非对象值,会抛出 TypeError
const ws3 = new WeakSet([val1, "val2"]); // TypeError: Invalid value used in weak set
弱值
表示被 WeakSet 持有的值不属于正式的引用,不会阻止垃圾回收
const ws = new WeakSet();
ws.add({});
ws 实例 add 了一个新对象,并将他作为一个值,因为没有指向这个对象的其他引用,所以当这行代码执行完成后,这个值就被当作垃圾回收,然后,这个值就从弱集合中消失,会使 ws 成为一个空集合
const ws = new WeakSet();
const container = {
obj: {},
};
ws.add(container.obj);
log(ws.has(container.obj)); // log: true
// 这里会摧毁 container 对象对 val 持有的 {} 的引用,执行这个函数之后, 垃圾回收就会吧这个值清理掉
const removeReferenc = () => (container.obj = null);
removeReferenc();
log(ws.has(container.obj)); // log: false