Skip to main content

WeakSet

WeakSet 是可被 垃圾回收 的值的集合, 其中的 必须是 对象非全局注册的符号。并且只能出现一次。

初始化

const val1 = { id: 1 };
const val2 = { id: 2 };
const val3 = { id: 3 };

const weakset = new WeakSet([val1, val2, val3]);

console.log(weakset.has(val1)); // true
console.log(weakset.has(val2)); // true
console.log(weakset.has(val3)); // true

如果尝试使用添加 非对象设置 , 会抛出 TypeError

const weakset = new WeakSet();

weakset.add("value1"); // Uncaught TypeError: Invalid value used as weak set key

基本 API

可以使用 add() 在添加 , add() 方法返回 WeakSet 实例, 因此 可以把 多个操作 连接 起来。

可以使用 has() 进行查询。可以通过 size 属性获取 WeakSet 的数量。

可以使用 delete()clear() 删除值。

const weakset = new WeakSet();

const val1 = { id: 1 };
const val2 = { id: 2 };

console.log(weakset.has(val1)); // false

weakset.add(val1).add(val2);

console.log(weakset.has(val1)); // true
console.log(weakset.has(val2)); // true

console.log(weakset.delete(val1));

console.log(weakset.has(val1)); // false
console.log(weakset.has(val2)); // true

弱值

一个对象作为 WeakSet 存在 , 不会阻止垃圾回收。

如果一个对象作为 被回收, 那么在 WeakSet 中相应的 便成为了进行 垃圾回收 的候选对象。

container 对象维护着一个 的引用, 因此这个对象 不会成为垃圾回收的目标。

但是如果调用了 removeReference(), 就会摧毁对象的最后一个引用, 垃圾回收就会把这个键值对清理掉。

const weakset = new WeakSet();

const container = {
key: {},
};

weakset.add(container.key);

function removeReference() {
container.key = null;
}

不可迭代

因为 WeakSet 中的 任何时候都有可能会被 垃圾回收 ,所以没有必要提供迭代 的能力。