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的优点是可以在算法仍在运行时对其内容进行垃圾收集,因此当您处理大量懒惰的数据(甚至可能异步处理)时,它有助于减少内存消耗(甚至防止泄漏)。 )产生。

09-25 16:24