【发布时间】:2015-08-13 21:13:26
【问题描述】:
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 的实际用途是什么?
【问题讨论】:
-
@RahulTripathi 是的,我看过这个文档,但它没有回答我的问题。
-
@Teemu 是的,它不会删除变量,但会删除引用。在这种情况下,它是最后一个引用,这意味着数组对象变成了不可访问的垃圾。 :)
-
任何解决方案中没有提到的一件事是关于您对控制台的问题。我刚刚处理了这个问题,发现控制台保留了对 WeakSet() 的引用,因此它会一直保留在那里,直到您关闭并重新打开控制台。永远在 WTF 模式下度过,直到我这样做并繁荣 - 所有的 WeakSet 看起来都应该如此!我觉得该属性可以为垃圾收集器提供一些非常好的调试,并确认正在按预期删除内容。
标签: javascript ecmascript-6 traceur