概念:

类似于数组,但是成员的值都是唯一的,没有重复的值。

基本用法

Set是一个构造函数,通过new生成Set数据结构。参数可以是数组(具有iterable接口的数据类型,比如nodeList,字符串,arguments)

  1. var s
  2. // 数组
  3. s = new Set([1, 2, 2, 1])
  4. console.log(s) // Set { 1, 2 }
  5. // 字符串
  6. s = new Set('abcabc')
  7. console.log(s) // Set { 'a', 'b', 'c' }
  8. // arguments
  9. function a () {
  10. console.log(new Set(arguments)) // Set {1, 2, 4}
  11. }
  12. a(1, 2, 4)

数组去重:

  1. // 去除数组的重复成员
  2. [...new Set([1,2,2,1])] // [1,2]

字符串去重:

  1. [...new Set('ababbc')].join('') // "abc"

去重的判断规则是类似于全等运算符===,不同之处在于,这里的NaN === NaN 是true。

属性和方法

属性
  • Set.prototype.size 返回Set实例的成员总数

操作方法
  • add(val): 添加元素,返回Set实例
  • delete(val): 删除某个元素,返回布尔值,表示删除是否成功
  • has(val): 返回布尔值,表示实例中是否存在该元素
  • clear(): 清空实例,无返回值

Set实例的方法相比数组要方便很多,比如delete,has。对于数组中不存在重复元素的情况下,使用Set数据结构更方便。

遍历方法
  • keys(): 返回键名的遍历器
  • values(): 返回键值的遍历器
  • entries(): 返回键值对的遍历器
  • forEach(): 使用回调函数遍历每个成员

由于Set没有键名,只有健值,所以可以理解成键名,健值是同一个值。所以以上的遍历方法得到的键名,健值是相等的。

使用 Set 可以很容易地实现并集(Union)交集(Intersect)差集(Difference):

  1. let a = new Set([2, 3, 4])
  2. let b = new Set([3, 4, 5])
  3. // 并集
  4. let union = new Set([...a, ...b])
  5. console.log(union)
  6. // Set { 2, 3, 4, 5}
  7. // 交集
  8. let intersect = new Set([...a].filter(x => b.has(x)))
  9. console.log(intersect)
  10. // set {3, 4}
  11. // 差集
  12. let difference = new Set([...a].filter(x => !b.has(x)))
  13. console.log(difference)
  14. // Set {2}

WeakSet

WeakSet是一个构造函数,使用new创建WeakSet结构。WeakSet结构成员只能是对象,而且如其名都是弱引用无法遍历

  1. const ws = new WeakSet(params)

params可以是数组或具有iterable接口的对象,该数组的所有成员都会自动成为WeakSet对象的成员。所以该数组的所有成员只能是对象。

  1. const a = [[1, 2], [3, 4]];
  2. const ws = new WeakSet(a);
  3. // WeakSet {[1, 2], [3, 4]}