SetES6 中提供的新数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成 Set 数据结构。
const set = new Set();
set.add(1);
set.add(2);
set.add(2);
console.log(set.size); // 2
console.log([...set]); // [1, 2]
上面的代码可以看到,因为Set是没有重复值的,所以当添加两个2的时候只加进去一个2。这里size是Set实例的一个属性,返回Set实例的成员总数。
另外,Set还可以接受一个数组作为参数,用来初始化。
const setAarrray = new Set([1, 2, 2, "2", 3, 3, 4, 5, NaN, NaN, {}, {}]);
console.log([...setAarrray]); //[1, 2, "2" 3, 4, 5, NaN, {}, {}];
这个时候2和"2"都加进去了,是因为在Set内部判断两个值是否相等用的是全等"==="。有一点要注意的是,向 Set 加入值时认为NaN
等于自身,而精确相等运算符认为NaN
不等于自身。所以上面代码中,添加两个NaN时,加进去一个。上面添加两个空对象时都加进去了,说明两个空对象是不相等的。在Set内部认为,两个对象总是不等的。
Set实例有自己的方法,下面介绍一下它的方法:
Set.prototype.add(value)
:添加某个值,返回 Set 结构本身。Set.prototype.delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。Set.prototype.has(value)
:返回一个布尔值,表示该值是否为Set
的成员。Set.prototype.clear()
:清除所有成员,没有返回值。
const set = new Set();
set.add(1);
set.add(2);
console.log(set.size); //2
console.log(set.has(1)); //true
console.log(set.has(2)); //true
console.log(set.has('2')); //false
set.delete(2);
console.log(set.size); //1
console.log(set.has(2)); //false
Set 结构的实例还有遍历操作,可以用于遍历成员。下面是遍历的四种方法
Set.prototype.keys()
:返回键名的遍历器Set.prototype.values()
:返回键值的遍历器Set.prototype.entries()
:返回键值对的遍历器Set.prototype.forEach()
:使用回调函数遍历每个成员
keys
方法、values
方法、entries
方法返回的都是遍历器对象。由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys
方法和values
方法的行为完全一致。下面代码中entries
方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。
const set = new Set(["a", "b", "c"]);
for (let item of set.keys()) {
console.log(item);
// "a"
// "b"
// "c"
}
for (let item of set.values()) {
console.log(item);
// "a"
// "b"
// "c"
}
for (let item of set.entries()) {
console.log(item);
// ["a", "a"]
// ["b", "b"]
// ["c", "c"]
}
还可以省略values
方法,直接用for...of
循环遍历 Set。
const set = new Set(["a", "b", "c"]);
for (let item of set) {
console.log(item);
// "a"
// "b"
// "c"
}
Set 结构的实例与数组一样,也拥有forEach
方法,用于对每个成员执行某种操作,没有返回值。
const set = new Set(["a", "b", "c"]);
set.forEach((value, key) => {
console.log(value + ":" + key);
// a:a
// b:b
// c:c
});
Set可以进行数组和字符串的去重
const array = [1, 2, 3, 4, 4, 3, 2, 3];
const resultArray = [...new Set(array)];
console.log(resultArray); // [1, 2, 3, 4]
const str = 'abbbcc';
const resultStr = [...new Set(str)].join('');
console.log(resultStr); // "abc"
大概就是这些,如果想知道得更详细可以去查看ES6。地址 http://es6.ruanyifeng.com/#docs/set-map