ES6中提供了两新数据结构-Set和WeakSet。Set是类似于数组,但是成员变量的值都是唯一的,没有重复的值。WeakSet也是不重复的值的集合,但是只能用来存放对象。
Set本身提供了一个构造函数,用来生成Set数据结构。
Set的声明
let setArr = new Set(['aaa',111,null,undefined]);
console.log(setArr);//Set(4) {"aaa", 111, null, undefined}
Set不允许内部有重复的值,只能显示一个,相当于去重。
Set的方法和属性
Set的属性
Set.prototype.size:返回Set实例的成员数量。
Set.prototype.constructor:默认的构造Set函数。
let setArr = new Set(['aaa','bbb','ccc','bbb']);
for (let item of setArr){
console.log(item);//aaa bbb ccc
}
console.log(setArr.size);//3
Set的操作函数
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除成功。
has(value):返回一个布尔值,表示参数是否为Set的成员。
clear():清除所有成员,没有返回值。
add()增加
let setArr = new Set(['aaa','bbb','ccc','bbb']);
console.log(setArr);//Set(3) {"aaa", "bbb", "ccc"}
setArr.add('ddd');
console.log(setArr);
delete删除
let setArr = new Set(['aaa','bbb','ccc','bbb']);
setArr.delete('bbb');
console.log(setArr);//Set(2) {"aaa", "ccc"}
has(value)
let setArr = new Set(['aaa','bbb','ccc','bbb']);
console.log(setArr.has('aaa'));//true
clear()
let setArr = new Set(['aaa','bbb','ccc','bbb']);
setArr.clear();
console.log(setArr);//Set(0) {}
Set遍历操作
for....of
set有四个遍历方法。可以用于遍历成员。
keys() :返回一个键名的遍历器
values() :返回一个值的遍历器
entries() :返回一个键值对的遍历器
forEach():使用回调函数遍历每个成员
注意:由于Set没有键名,只有值名,keys()和values()返回的结果是一样,
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);
}
//所以,entries方法返回的遍历器同时包括键名和值,所以每次输出的是一个数组。其实成员都是完全一样的。
注意:Set默认的可遍历,其默认遍历器生成函数就是它的values方法。
这就意味着,可以省略values方法,直接用for…of遍历。
var set = new Set([1,2,3,4]);
for(let x of set){
console.log(x);//1 2 3 4
}
forEach()
let setArr = new Set(['aaa','bbb','ccc','bbb']);
setArr.forEach((value)=>console.log(value));//aaa bbb ccc
WeakSet使用
WeakSet类似于Set,也是不重复的值的集合。但是它只能用于存储对象。而不能是其他类型的值。
WeakSet是一个个构造函数。可以接受数组和类似数组的对象作为参数。(实际上,任何具作为iterable接口的对象都可以作为WeakSet的参数)。该数组的所有成员都会自动成为WeakSet的实例对象的成员。
let Weak_Set=new WeakSet();
let obj={a:1,b:'aaa'}
Weak_Set.add(obj);
console.log(Weak_Set);
WeakSet结构有以下的方法
WeakSet.protoptype.add(value):向WeakSet实例添加一个新成员。
WeakSet.protoptype.delete(value):删除WeakSet实例指定成员。
WeakSet.protoptype.has(value):返回一个布尔值,表示某个值是否在WeakSet实例中。
WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历不能保证成员的存在。可能刚刚遍历结束,成员就取不到了。WeakSet的一个用处是存储DOM节点,而不用担心这些节点从文档移除时,会引起内存的泄露。