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/