WeakSet 应该通过弱引用存储元素。也就是说,如果一个对象没有被其他任何东西引用,它应该从 WeakSet 中清除。
我写了以下测试:
var weakset = new WeakSet(),
numbers = [1, 2, 3];
weakset.add(numbers);
weakset.add({name: "Charlie"});
console.log(weakset);
numbers = undefined;
console.log(weakset);
即使我的 [1, 2, 3]
数组没有被任何东西引用,它也没有从 WeakSet 中删除。控制台打印:
WeakSet {[1, 2, 3], Object {name: "Charlie"}}
WeakSet {[1, 2, 3], Object {name: "Charlie"}}
这是为什么?
另外,我还有一个问题。直接将对象添加到 WeakSets 有什么意义,就像这样:
weakset.add({name: "Charlie"});
那些是 Traceur 的故障还是我遗漏了什么?
最后,如果我们甚至无法遍历它也无法获取当前大小,那么 WeakSet 的实际用途是什么?
原文由 Robo Robok 发布,翻译遵循 CC BY-SA 4.0 许可协议
很可能是因为垃圾收集器尚未运行。但是,您说您正在使用 Traceur,所以可能只是它们没有得到适当的支持。我想知道
console
如何显示WeakSet
的内容。绝对没有必要将对象文字添加到
WeakSet
s。您所能得到的只是一点信息:集合中是否包含对象(或一般值)?
这在您想要“标记”对象而不实际改变它们(在它们上设置属性)的情况下很有用。许多算法包含某种“如果
x
已经看到”条件(JSON.stringify
循环检测可能是一个很好的例子),当你使用用户提供的值时使用Set
/WeakSet
是可取的。 aWeakSet
的优点是它的内容可以在你的算法仍在运行时被垃圾收集,所以当你处理大量数据时它有助于减少内存消耗(甚至防止泄漏)是懒惰地(甚至可能是异步地)产生的。