基本API

  • 创建的同时初始化实例:
1
2
3
4
5
6
7
8
9
10
11
12
// 使用数组初始化集合 
const s1 = new Set(["val1", "val2", "val3"]);
alert(s1.size); // 3
// 使用自定义迭代器初始化集合
const s2 = new Set({
[Symbol.iterator]: function*() {
yield "val1";
yield "val2";
yield "val3";
}
});
alert(s2.size); // 3
  • 初始化之后,可以使用:
    • add ()增加值;
    • has()查询;
    • size取得元素数量;
    • delete()删除元素;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const s = new Set(); 
alert(s.has("Matt")); // false
alert(s.size); // 0
s.add("Matt")
.add("Frisbie");
alert(s.has("Matt")); // true
alert(s.size); // 2
s.delete("Matt");
alert(s.has("Matt")); // false
alert(s.has("Frisbie")); // true
alert(s.size); // 1
s.clear(); // 销毁集合实例中的所有值
alert(s.has("Matt")); // false
alert(s.has("Frisbie")); // false
alert(s.size); // 0
  • Set 可以包含任何 JavaScript 数据类型作为值:
1
2
3
4
5
6
7
8
9
10
11
12
const s = new Set(); 
const functionVal = function() {};
const symbolVal = Symbol();
const objectVal = new Object();
s.add(functionVal);
s.add(symbolVal);
s.add(objectVal);
alert(s.has(functionVal)); // true
alert(s.has(symbolVal)); // true
alert(s.has(objectVal)); // true
// SameValueZero 检查意味着独立的实例不会冲突
alert(s.has(function() {})); // false
  • 用作值的对象和其他“集合”类型在自己的内容或属性被修改时也不会改变:
1
2
3
4
5
6
7
8
9
const s = new Set(); 
const objVal = {},
arrVal = [];
s.add(objVal);
s.add(arrVal);
objVal.bar = "bar";
arrVal.push("bar");
alert(s.has(objVal)); // true
alert(s.has(arrVal)); // true
  • add()和delete ()操作是幂等的;
  • delete()返回一个布尔值,表示集合中是否存在要删除的值:
1
2
3
4
5
6
7
8
9
const s = new Set(); 
s.add('foo');
alert(s.size); // 1
s.add('foo');
alert(s.size); // 1
// 集合里有这个值
alert(s.delete('foo')); // true
// 集合里没有这个值
alert(s.delete('foo')); // false

顺序与迭代

  • 集合实例可以提供一个迭代器( Iterator ),能以插入顺序生成集合内容。
  • 可以通过values()方法及其别名方法keys() (或者Symbol. iterator属性,它引用values() )取得这个迭代器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const s = new Set(["val1", "val2", "val3"]); 
alert(s.values === s[Symbol.iterator]); // true
alert(s.keys === s[Symbol.iterator]); // true
for (let value of s.values()) {
alert(value);
}
// val1
// val2
// val3
for (let value of s[Symbol.iterator]()) {
alert(value);
}
// val1
// val2
// val3
  • values ()是默认迭代器,所以可以直接对集合实例使用扩展操作,把集合转换为数组:
1
2
const s = new Set(["val1", "val2", "val3"]); 
console.log([...s]); // ["val1", "val2", "val3"]
  • 集合的entries()方法返回一个迭代器,可以按照插人顺序产生包含两个元素的数组,这两个元素是集合中每个值的重复出现:
1
2
3
4
5
6
7
const s = new Set(["val1", "val2", "val3"]); 
for (let pair of s.entries()) {
console.log(pair);
}
// ["val1", "val1"]
// ["val2", "val2"]
// ["val3", "val3"]
  • 如果不使用迭代器,而是使用回调方式,则可以调用集合的forEach() 方法并传人回调,依次迭代每个键/值对。传入的回调接收可选的第二个参数,这个参数用于重写回调内部this的值:
1
2
3
4
5
const s = new Set(["val1", "val2", "val3"]); 
s.forEach((val, dupVal) => alert(`${val} -> ${dupVal}`));
// val1 -> val1
// val2 -> val2
// val3 -> val3