Set
JS一种数据类型,类似于数组,但是成员值都是唯一的,没有重复的值
Set函数接受一个数组(或者具有Iterable接口的其他类型的数据结构)作为参数用来初始化
Set加入值的时候,不会发生类型转换,所以s与"s"是不同的值。
Set内部判断两个值是否相同时,使用的算法叫做Same-value-zero equality,它类似于精确相等运算符(===).主要区别是NAN在Set中是相同的两个值,而 === 是不同的两个值
属性
size:返回set实例成员数量
方法
add():添加一个值,返回Set结构本身
delete():删除一个值,返回一个布尔值,表示删除是否成功
has():返回一个布尔值,表示该值是否为set成员
clear():清除所有成员,这个方法没有返回值
keys():返回键名遍历器
values():返回值遍历器
由于Set结构没有键名,只有键值,所以keys方法与values方法行为完全一致
let set = new Set(['blue','yello','red']);
for(let item of set.keys()){
console.log(item); // blue yello red
}
for(let item of set.values()){
console.log(item); // blue yello red
}
Set结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法
Set.prototype[symbol.iterator] === Set.prototype.values; //true
for(let item of set){
console.log(item); //blue yello red;
}
entries():返回键值对遍历器
for(let item of set.entries()){
console.log(item); //['blue','blue'] ['yello','yello'] ['red','red']
}
forEach():使用回调函数遍历每个成员,用于对成员执行操作,并没有返回值
set.forEach((values,index)=>{
console.log(`${index}:${values}`);
})
使用实例
扩展运算符(...)内部使用的是for...of循环,所以也可以用于Set结构
扩展运算符与Set结构结合,就可以实现数组的重复成员
let arr = [1,1,2,3,4,4,5];
let set = new Set(arr);
let arr1 = [...set]; // [1,2,3,4,5];
Set结构同样可以用于字符串去重
[...new Set('aabbccdd')].join('');
数组的map和filter方法也可以间接用于Set
let set = new Set([1,2,3]);
set = new Set([...set].map((values,index)=>{
return value * 2; //[2,4,6]
}))
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0)); //[2,4];
WeakSet
结构与Set类似,也是不重复值的集合。但是他与Set有两个区别
WeakSet成员只能是对象
WeakSet中的对象都是弱引用
WeakSet没有size属性
WeakSet结构只有以三个方法
WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在