ECMAScript 6引入了两种非常相似的集合类型:Set
和WeakSet
。它们之间有什么区别呢?
ECMAScript 6引入了两种非常相似的集合类型:Set
和WeakSet
。它们之间有什么区别呢?
主要的不同点在于,Set中对对象的引用是强引用,而WeakSet中对对象的引用是弱引用。这意味着如果没有其他引用指向WeakSet中的对象,该对象可能会被垃圾回收。
其他区别(或副作用)包括:
WeakSet
允许你在 O(1) 时间内检查任何对象是否已经被添加进去。你可以将其用作布尔值检查对象,例如用于记忆化方法的情况下。另一个好处是,如果对象超出范围,不像普通的 Set
会浪费内存,因为它可以被垃圾回收。 - Patrick RobertsWeakSet是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
的弱引用行为。 - Spike SagalSet(集合):是一组值的集合,其中每个值只能出现一次。主要方法有add(添加)、delete(删除)、has(是否存在)、clear(清空)和size(大小)。
WeakSet(弱集合):WeakSet对象允许您存储一组唯一的键。"WeakSet"键不能是原始类型。它们也不能由数组或另一个集合创建。WeakSet的值必须是对象引用。
example will be more clear if written like this :
let myWeakSet = new WeakSet();
let x = {name:"ali",age:38};
myWeakSet.add(x);
x = 5;
console.log(myWeakSet);
then:
let mySet = new Set();
let x = {name:"ali",age:38};
mySet.add(x);
x = 5;
console.log(mySet);
in the first example console will show you that weakSet contain no objects because another value was assigned to object reference (x) ......but in second example console will show you that Set contain an object ... and by making mySet iterable you can see the properties of object(x) you have added to mySet :
console.log(mySet.values().next().value);