JS - WeakSet 弱集合

206 阅读1分钟

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