ES6 Set 和 WeakSet 有什么区别?

问题描述 投票:0回答:5

ECMAScript 6 有这些非常相似的集合:

Set
WeakSet
。他们有什么区别?

javascript ecmascript-6 weak-references
5个回答
32
投票

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

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

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

11
投票

总结:

Weaksets 是保存对象集合的 JavaScript 对象。由于集合的性质,同一对象中只能出现一个对象引用。弱集与普通集在以下方面有所不同:

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


4
投票

Set:- Set 是值的集合,其中每个值只能出现一次。主要方法有添加、删除、有、清除和大小。

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


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

0
投票

例子这样写会更清楚:

let myWeakSet = new WeakSet();
let x = {name:"ali",age:38};
myWeakSet.add(x);
x = 5; 
console.log(myWeakSet);

然后:

let mySet = new Set();
let x = {name:"ali",age:38};
mySet.add(x);
x = 5; 
console.log(mySet);

在第一个示例中,控制台将向您显示

WeakSet
不包含任何对象,因为另一个值被分配给对象引用 (x),但在第二个示例中,控制台将向您显示 Set 包含一个对象,并且通过使
mySet
可迭代,您可以查看您添加到
mySet
的对象 (x) 的属性:

console.log(mySet.values().next().value);
© www.soinside.com 2019 - 2024. All rights reserved.