它类似于数组,但是成员的值都是唯一的,没有重复的值。
const s = new Set(); s.add('123');
const set = new Set([1, 2, 3, 4, 4]); console.log(...set); //1 2 3 4
向 Set 加入值的时候,不会发生类型转换,所以5
和"5"
是两个不同的值。
Set 内部判断两个值是否不同,类似于精确相等运算符(===
),主要的区别是向 Set 加入值时认为NaN
等于自身,而精确相等运算符认为NaN
不等于自身。
let set = new Set(); let a = NaN; let b = NaN; set.add(a); set.add(b); console.log(set); // Set {NaN}
另外,两个对象总是不相等的。
let set = new Set(); let a = {name: '111'}; let b = {name: '111'}; set.add(a); set.add(b); console.log(set); // Set [object, object]
方法:
has delete
const s = new Set();
s.add('123').add(2);
console.log(s.has('123'));//true
s.delete(2);
console.log(s.has(2)); // false
Array.from
方法可以将 Set 结构转为数组。这就提供了去除数组重复成员的另一种方法。
const items = new Set([1, 2, 3, 4, 5, 2, 4]);
const array = Array.from(items); //[1, 2, 3, 4, 5]
keys()
,values()
,entries()
let set = new Set(['red', 'green', 'blue']); for (let item of set.keys()) { console.log(item); } // red // green // blue for (let item of set.values()) { console.log(item); } // red // green // blue for (let item of set.entries()) { console.log(item); } // ["red", "red"] // ["green", "green"] // ["blue", "blue"]
foreach()
let set = new Set([1, 4, 9]); set.forEach((value, key) => console.log(key + ' : ' + value)) // 1 : 1 // 4 : 4 // 9 : 9
数组的map
和filter
方法也可以间接用于 Set 了。
let set = new Set([1, 2, 3]); set = new Set([...set].map(x => x * 2)); // 返回Set结构:{2, 4, 6} let set = new Set([1, 2, 3, 4, 5]); set = new Set([...set].filter(x => (x % 2) == 0)); // 返回Set结构:{2, 4}
如果想在遍历操作中,同步改变原来的 Set 结构,目前没有直接的方法,但有两种变通方法。一种是利用原 Set 结构映射出一个新的结构,然后赋值给原来的 Set 结构;另一种是利用Array.from
方法。
// 方法一 let set = new Set([1, 2, 3]); set = new Set([...set].map(val => val * 2)); // set的值是2, 4, 6 // 方法二 let set = new Set([1, 2, 3]); set = new Set(Array.from(set, val => val * 2)); // set的值是2, 4, 6