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的实际用途是什么?

最佳答案

它不会从WeakSet中删除。这是为什么?


最有可能是因为垃圾收集器尚未运行。但是,您说您正在使用Traceur,所以可能是它们没有得到适当的支持。我不知道console如何仍然可以显示WeakSet的内容。


  直接将对象添加到WeakSets有什么意义?


将对象文字添加到WeakSet绝对没有意义。


  如果我们甚至无法遍历WeakSet也无法获得当前大小,那么WeakSet的实际用途是什么?


您所能获得的只是一点点信息:集合中是否包含对象(或通常为值)?

这在您希望“标记”对象而不实际对其进行更改(在其上设置属性)的情况下很有用。许多算法包含某种“如果已经看到x”条件(JSON.stringify循环检测可能是一个很好的示例),并且当您使用用户提供的值时,会使用Set / 建议。 WeakSet的优点是可以在算法仍在运行时对其内容进行垃圾收集,因此当您处理大量懒散(可能是)的数据时,它有助于减少内存消耗(甚至防止泄漏)。甚至异步生成)。

关于javascript - ECMAScript 6:WeakSet的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48644221/

10-11 05:55