Set、WeakSet

一、Set

直观上和数组类似,最大的特点是自动去重,去重时对比的方式类似于恒等(===)。

Set判断成员是否相同与严格相等(===)区别:

  • 0和-0:Set是同一个key,=== 认为不相等

  • NaN和NaN:Set是同一个key,=== 认为不相等

1、实例属性及方法

  • Set.prototype.add(value)

  • Set.prototype.has(value)

  • Set.prototype.delete(value)

  • Set.prototype.clear()

  • Set.prototype.size

2、遍历方法

  • Set.prototype.forEach((value, key, set) => {}, thisArg) 【推荐】

  • Set.prototype.entries()

  • Set.prototype.keys():Set.prototype.values的别名

  • Set.prototype.values()

注意:Set的遍历顺序就是插入顺序

3、类型转换

  • Array => Set

  • String => Set

  • Set => Array

4、应用

  • 数组去重

  • 字符串去重

  • 数组的交、并、补集

二、WeakSet

1、成员类型只能是对象

2、成员是弱引用

WeakSet 中的对象都是弱引用不计入垃圾回收机制,如果其他地方都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

3、不支持遍历

由于成员对象随时有可能被回收掉,成员数量不可预测,所以没有提供size属性,无法进行对WeakSet进行遍历。

仅以下3个实例方法:

  • Set.prototype.add(value)

  • Set.prototype.has(value)

  • Set.prototype.delete(value)

三、对比

区别
Set
WeakSet

成员类型

不限

对象

成员函数和属性

  • Set.prototype.add(value)

  • Set.prototype.has(value)

  • Set.prototype.delete(value)

  • Set.prototype.size

  • Set.prototype.clear()

  • Set.prototype.forEach()

  • Set.prototype.values()

  • Set.prototype.keys()

  • Set.prototype.entries()

  • WeakSet.prototype.add(value)

  • WeakSet.prototype.has(value)

  • WeakSet.prototype.delete(value)

遍历

支持

不支持

适用场景

有去重需求的数据

不关心垃圾回收机制(比如存储DOM节点)

参考:

Last updated