ES6 Set和WeakSet有什么区别?

Lub*_*rek 11 javascript weak-references ecmascript-6

ECMAScript 6有这些非常相似的集合:SetWeakSet.他们之间有什么区别?

Lub*_*rek 11

主要区别在于对Set中对象的引用很强,而对WeakSet中对象的引用很弱.这意味着如果没有其他引用,WeakSet中的对象可以被垃圾收集.

其他差异(或相反的副作用)是:

  • 集可以存储任何值.WeakSets只是对象的集合.
  • WeakSet没有size属性.
  • WeakSet没有clear,keys,values,entries,forEach方法.
  • WeakSet不可迭代.

  • `WeakSet 不可迭代` 那我们为什么要使用它以及如何解析它呢? (2认同)
  • @VikasBansal`WeakSet`允许您在O(1)时间内检查是否已添加任何对象.你可以使用它作为对象的布尔检查,例如,一个memoized方法,另一个好处是,如果对象超出范围,你不会像在正常的'Set`中那样浪费内存,因为它然后可以被垃圾收集. (2认同)

Wil*_*een 10

概括:

弱集是包含对象集合的 javascript 对象。由于集合的性质,在该集合中仅可能出现同一对象的一个​​对象引用。弱集在以下方面与普通集不同:

  1. 弱集只能在其集合中保存对象,不允许使用原始值(例如int, boolean, string)。
  2. 对对象的引用是很弱的。这意味着只要除了 没有其他指向对象的引用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)); 
                     
Run Code Online (Sandbox Code Playgroud)