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

let set = new Set(array)
  • String => Set

let set = new Set(string)
  • Set => Array

let set = new Set([1,2,3])

// 方式1
let arr1 = [...set];

// 方式2
let arr2 = Array.from(set);

4、应用

  • 数组去重

let arr = [...new Set(arr)]
  • 字符串去重

let str = [...new Set(str)].join('');
  • 数组的交、并、补集

let a = [1, 2, 3];
let b = [3, 4, 5];

// 交集
let intersect = a.filter(item => b.includes(item));

// 并集
let union = [...new Set([...a, ...b])];

// 补集
let difference = [...a.filter(item => !b.includes(item)), ...b.filter(item => !a.includes(item))]

二、WeakSet

1、成员类型只能是对象

const ws = new WeakSet();

ws.add(1); // TypeError: Invalid value used in weak set
ws.add('1'); // TypeError: Invalid value used in weak set
ws.add(true); // TypeError: Invalid value used in weak set
ws.add(null); // TypeError: Invalid value used in weak set
ws.add(undefined); // TypeError: Invalid value used in weak set

ws.add(Symbol());
ws.add({});

ws.add(() => {});
ws.add([]);
ws.add(new Map());

2、成员是弱引用

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

3、不支持遍历

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

仅以下3个实例方法:

  • Set.prototype.add(value)

  • Set.prototype.has(value)

  • Set.prototype.delete(value)

三、对比

区别SetWeakSet

成员类型

不限

对象

成员函数和属性

  • 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