1. 简介
ECMAScript 6 新增的 Set
是一种新集合类型,为这门语言带来集合数据结构。Set
在很多方面都像是加强的 Map
,这是因为它们的大多数 API 和行为都是共有的。
2. 基本 API
使用 new
关键字和 Set
构造函数可以创建一个空集合:
const m = new Set();
// 使用数组初始化集合
const s1 = new Set(["val1", "val2", "val3"]);
alert(s1.size); // 3
初始化之后,可以使用 add()
增加值,使用 has()
查询,通过 size
取得元素数量,以及使用 delete()
和 clear()
删除元素:
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
add()
返回集合的实例,所以可以将多个添加操作连缀起来,包括初始化:
const s = new Set().add("val1");
s.add("val2")
.add("val3");
alert(s.size); // 3
与 Map
类似,Set
可以包含任何 JavaScript 数据类型作为值。
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
与严格相等一样,用作值的对象和其他“集合”类型在自己的内容或属性被修改时也不会改变:
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()
返回一个布尔值,表示集合中是否存在要删除的值:
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