ES6 Set 和 WeakSet 有什么区别?

What's the difference between ES6 Set and WeakSet?

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

主要区别在于,对 Set 中对象的引用是强引用,而对 WeakSet 中对象的引用是弱引用。这意味着如果没有其他引用.

,WeakSet 中的一个对象可以被垃圾回收。

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

  • 集合可以存储任何值。 WeakSet 只是对象的集合。
  • WeakSet 没有 size 属性.
  • WeakSet 没有 clear、keys、values、entries、forEach 方法。
  • WeakSet 不可迭代。
  • 集只允许存储一次。
  • set中存储的元素不 有一个键或索引。所以很难使用检索元素 默认方法如 get()
  • WeakSet 只接受对象作为它的值。
  • 如果没有任何其他对存储对象的引用(引用是弱的),弱集不会阻止垃圾回收

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

WeakSet:- WeakSet objects allows you to store collection of unique key.“WeakSet”键不能是原始类型。 它们也不能由数组或另一组创建。 WeakSet 的值必须是对象引用。

总结:

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

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