【发布时间】:2017-04-10 09:47:29
【问题描述】:
ECMAScript 6 有这些非常相似的集合:Set 和 WeakSet。它们有什么区别?
【问题讨论】:
标签: javascript ecmascript-6 weak-references
ECMAScript 6 有这些非常相似的集合:Set 和 WeakSet。它们有什么区别?
【问题讨论】:
标签: javascript ecmascript-6 weak-references
主要区别在于对 Set 中对象的引用是强引用,而对 WeakSet 中对象的引用是弱引用。这意味着如果没有其他对 WeakSet 中的对象的引用,则可以对它进行垃圾回收。
其他差异(或更确切地说是副作用)是:
【讨论】:
WeakSet is not iterable 那我们为什么要使用它以及如何解析呢?
WeakSet 允许您检查 O(1) 时间是否已添加任何对象。您可以将其用作对象的布尔检查,例如记忆化方法,另一个好处是,如果对象超出范围,您不会像在普通Set 中那样浪费内存,因为它然后可以被垃圾收集。
弱集是包含对象集合的 javascript 对象。由于集合的性质,在集合中可能只出现同一对象的一个对象引用。 Weakset 在以下方面与普通集合不同:
int、boolean、string)。WeakSet 之外没有对该对象的其他引用,该对象就可以被垃圾回收(即JS 引擎将释放该引用指向的对象的内存)。 let myWeakSet = new WeakSet();
let obj = {};
myWeakSet.add(obj);
console.log(myWeakSet.has(obj));
// break the last reference to the object we created earlier
obj = 5;
// false because no other references to the object which the weakset points to
// because weakset was the only object holding a reference it released it and got garbage collected
console.log(myWeakSet.has(obj));
【讨论】:
myWeakSet 此时不包含对obj 的引用,因为obj 指向原始值5。这并不能说明WeakSet 的弱引用行为。
Set:- Set 是值的集合,其中每个值只能出现一次。主要方法有add、delete、has、clear和size。
WeakSet:- WeakSet 对象允许您存储唯一键的集合。“WeakSet”键不能是原始类型。 它们也不能由数组或其他集合创建。 WeakSet 的值必须是对象引用。
【讨论】:
【讨论】: