新的数据结构Set
set实例的属性和方法
1)Set结构的实例有以下属性
Set.prototype.constructor: 构造函数,默认就是Set函数
Set.prototype.size:返回Set实例的成员总数
2)set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)
操作方法(用于操作数据)
-add(value): 添加某个值,返回Set结构本身。
-delete(value):删除某个值,返回一个布尔值,标书删除是否成功
-has(value):返回一个布尔值,表示该值是否为set的成员
-clear():清除所有成员,没有返回值
let s2 = new Set();
s2.add(1).add(2).add(2)
console.log(s2.size);
console.log(s2.has(1));
console.log(s2.has(2));
console.log(s2.has(3));
s2.delete(2);
console.log(s2.has(2));
遍历方法(用于遍历成员)
-keys():返回键名的遍历器;
-values():返回键值得遍历器;
-entries():返回键值对的遍历器:
-forEach():使用回调函数遍历每个成员;
注:需要特别指出的是,Set的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用 Set 保存一个回调函数列表,调用时就能保证按照添加顺序调用。
由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
let set5 = new Set([‘red‘, ‘green‘, ‘blue‘]);
for(let item of set5.keys()) {
console.log(item);
}
for(let item of set5.values()) {
console.log(item);
}
for(let [key, value] of set5.entries()) {
console.log([key, value]);
}
-for...of....
for(let x of set5) {
console.log(x);
}
-forEach()
set5.forEach((value, key) => console.log(key + ‘:‘ + value));
遍历的应用
let set6 = new Set([‘red‘, ‘green‘, ‘blue‘]);
let arr = [...set6];
console.log(arr);
let arr2 = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr2)];
console.log(unique);
let set7 = new Set([1, 2, 3]);
set7 = new Set([...set7].map(x => x * 2));
console.log(set7)
let a1 = new Set([1, 2, 3]);
let b1 = new Set([4, 3, 2]);
/*并集*/
let union = new Set([...a, ...b]);
/*交集*/
let intersect = new Set([...a].filter(x => b.has(x)));
/*差集*/
let difference = new Set([...a].filter(x => !b.has(x)));
去除数组中重复成员的方法
function dedepe(array) {
return Array.from(new Set(array));
}
console.log(dedepe([1, 1, 2, 3]));
3)注意点:Set结构不会添加重复的值
Set加入值得时候,不会发生类型的转换,5 和 ‘5‘是不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。
两个NaN是相等的 只能加入一个
let set3 = new Set();
let a = NaN;
let b = NaN;
set3.add(a);
set3.add(b);
console.log(set3);
两个对象是不相等的
let set4 = new Set();
set4.add({});
console.log(set4.size);
set4.add({});
console.log(set4.size);