Map 和 Set 是 ES6 中新增的数据结构,Set 类似于数组,但是其中的值是唯一的。我们一般将 Set 跟 Array 进行类比。

Set

set 是一个值的集合,其中的值是唯一。

set 的 API 跟 map 类似,add(..) 方法代替了 set(..) 方法,没有 get(..) 方法。

var s = new Set();
var x = { id: 1 },
  y = { id: 2 };

s.add(x);
s.add(y);
s.add(x);

s.size; // 2
s.has(y); // true
s.delete(y);
s.clear();

set 的唯一性可以用作一些地方:

var arr = [1, 2, 3, 4, '1', 2, 4, '5'];
var uniques = [...new Set(arr)]; // [ 1, 2, 3, 4, "1", "5" ]

在 set 里面,value 与 key 总是相等。

属性

  • Set.prototype.size size 属性获取 Set 对象的元素数量。

    var mySet = new Set();
    mySet.add(1);
    mySet.add(5);
    mySet.add('text');
    
    mySet.size; // 3
    

方法

  • Set.prototype.add() 将一个新元素添加到 Set 对象尾部。如果内部对象有重复的基础类型,则会忽略。引用类型的引用地址不同则会被添加。

    const set1 = new Set();
    const obj = { o: 3 };
    
    ```javascript
    set1.add(42);
    set1.add({ a: 1 });
    set1.add({ a: 1 });
    set1.add(obj);
    set1.add(obj);
    
    for (const item of set1) {
      console.log(item);
    }
    // 42
    // { a: 1 }
    // { a: 1 }
    // { o: 3 }
    
  • Set.prototype.clear() 将 Set 对象内所有的元素移除。
  • Set.prototype.delete() 移除指定的元素。若没有则返回 false
  • Set.prototype.entries() 返回一个 [value, value] 数组的遍历对象。每个实体的值都是一样的。

    const set1 = new Set();
    set1.add(42);
    set1.add('forty two');
    set1.add({ a: 1 });
    
    const iterator1 = set1.entries();
    
    for (const entry of iterator1) {
      console.log(entry);
    }
    // [42, 42]
    // ["forty two", "forty two"]
    // [{ a: 1 }, { a: 1 }]
    
  • Set.prototype.forEach() 遍历执行 Set 对象内的元素,参数依次为 value, key, set
  • Set.prototype.has() 返回指定的元素是否存在于 set 对象。
  • Set.prototype.values() 返回每个元素的值的遍历对象。也可以用别名 Set.prototype.keys()

WeakSet

WeakSet 的值必须是对象,而不是像 set 一样可以是原生类型值。

var s = new WeakSet();
var x = { id: 1 },
  y = { id: 2 };
s.add(x);
s.add(y);

x = null; // x 可 GC
y = null; // y 可 GC

参考链接