Set

表示一系列元素的无序集合,元素不可重复。

创建一个Set实例

可以将一个数组或者Set传入构造函数

  1. const set = new Set([0,1,2]);

实例的属性和方法

属性/方法 描述 返回值
set.size 集合元素的个数 返回集合元素的个数
set.add(value) 添加元素到集合内 返回set实例
set.delete(value) 删除集合内的指定元素 返回一个布尔值,表示是否删除成功
set.clear() 清空集合 /
set.has(value) 检查集合是否含有某元素 返回一个布尔值,表示集合是否含有某元素
set.forEach((value,key,set)=>{}[,context]) 遍历集合 /
set.entries() 遍历集合 返回一个以二元数组即键值对作为元素的可迭代对象
set.keys() 遍历集合 返回一个以当前集合中所有键作为元素的可迭代对象
set.values() 遍历集合 返回一个以当前集合中所有值作为元素的可迭代对象
  1. 需要特别指出的是,Set的遍历顺序就是插入顺序。
  2. Set 结构的键名就是键值(两者是同一个值),因此set.keys()和set.values()效果完全一样,以及set.forEach中的第一个参数和第二个参数两者值永远是一样的。

    1. let set = new Set([1, 4, 9]);
    2. set.forEach((value, key) => console.log(key + ' : ' + value))
    3. // 1 : 1
    4. // 4 : 4
    5. // 9 : 9


    应用

  3. 利用元素不重复性进行数组去重

    1. function unique(arr){
    2. return Array.from(new set(array))
    3. }

    比较Set与Array

  • 顺序和重复性的比较 | | Set | Array | | —- | —- | —- | | 元素序列 | 无序 | 有序 | | 元素可重复性 | 不可重复 | 可重复 |

  • 用forEach遍历时新增元素的表现不同

    1. const arr = [1]
    2. arr.forEach(f => {
    3. console.log(f)
    4. arr.push(2);
    5. })
    6. // 1

    forEach遍历数组时,如果在遍历过程中给数组新增元素,并不会遍历新增的元素。

    1. const set = new Set([1]);
    2. set.forEach(f => {
    3. console.log(f)
    4. set.add(2)
    5. });
    6. // 1
    7. // 2

    forEach遍历Set时,如果在遍历过程中给Set新增元素,会遍历新增的元素。如果想避免此种情况,可以将set作为初始值传给另一个set。

    1. const set = new Set([1]);
    2. const newSet = new Set(set);
    3. newSet.forEach(f => {
    4. console.log(f)
    5. set.add(2)
    6. });
    7. // 1

WeakSet

约束

  1. 不能包含值类型的元素,也不能包含无引用的对象,否则会自动被清除出集合
  2. 实例的方法就三个

实例的属性和方法

属性和方法 描述
weakset.add(value) 添加元素
weakset.delete(value) 删除元素
weakset.has(value) 检查集合是否含有元素