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"}}
这是为什么?
另外,我还有一个问题。将对象直接添加到WeakSet中的意义何在?
weakset.add({name: "Charlie"});
是那些Traceur的小故障,还是我想念什么?
最后,如果我们甚至无法遍历WeakSet也无法获得当前大小,那么WeakSet的实际用途是什么?
最佳答案
最有可能是因为垃圾收集器尚未运行。但是,您说您正在使用Traceur,因此可能是它们未得到正确支持。我不知道console
无论如何都可以显示WeakSet
的内容。
绝对没有必要在WeakSet
中添加对象文字。
您所能获得的只是一点点信息:集合中是否包含对象(或通常为值)?
这在您希望“标记”对象而不实际对其进行更改(在其上设置属性)的情况下很有用。许多算法包含某种“如果已经看到x
”条件(一个JSON.stringify
周期检测可能是一个很好的例子),并且当您使用用户提供的值时,建议使用Set
/WeakSet
。此处的WeakSet
的优点是可以在算法仍在运行时对其内容进行垃圾收集,因此当您处理大量懒惰的数据(甚至可能异步处理)时,它有助于减少内存消耗(甚至防止泄漏)。 )产生。