ES6 Set和WeakSet之间的区别是什么?

时间:2017-04-10 09:47:30

标签: javascript ecmascript-6 weak-references

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

4 个答案:

答案 0 :(得分:10)

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

其他差异(或更确切地说是副作用)是:

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

答案 1 :(得分:2)

设置: - Set是值的集合,其中每个值只能出现一次。主要方法有add,delete,has,clear和size。

WeakSet: - WeakSet对象允许您存储唯一键的集合。“ WeakSet ”键不能是原始类型。 它们也不能由数组或其他集创建。 WeakSet的值必须是对象引用。

答案 2 :(得分:2)

摘要:

弱集是javascript对象,其中包含对象的集合。由于集合的性质,在该集合内只能出现同一对象的一个​​对象引用。弱集在以下方面与正常集不同:

  1. 弱集只能保存其集合中的对象,不允许使用原始值(例如intbooleanstring)。
  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)); 
                     

答案 3 :(得分:0)

  • 集只允许存储一次。
  • 存储在集合中的元素不会 有一个键或索引。因此很难使用检索元素 默认方法,如get()
  • WeakSet只接受对象作为其值。
  • 如果对存储的对象没有任何其他引用(引用很弱),则弱集不会阻止垃圾收集。