ES6之前的数据集合主要是数组和对象,ES6补充的新数据结构Set、WeakSet、Map、WeakMap
Set
1、Set的基本使用
set 类似以数组,主要区别是有自己的方法,并且内部集合不能重复
let typeSet = new Set([1,2,3,4,6]);
typeSet.add(8);
typeSet.add("a");
typeSet.add(true);
console.log(typeSet)
返回的结果是一个set集合,和数组对象都不一样,是一个新的数据集合
设置初始值的方法有两种,第一中是通过add()方法进行设置的,第二种就是初始化的时候内部设置数组
如果我们想要使用初始化赋值的状态,赋值必须是数组,不可以是对象等等
set内部的值不能重复
let typeSet = new Set([1,2,3,4,6,2,1]);
typeSet.add(8);
typeSet.add("a");
typeSet.add(true);
console.log(typeSet)
set可打点调用 add方法
let typeSet = new Set([1,2,3,4,6,2,1]);
typeSet.add(8);
typeSet.add("a").add("b").add("c");
console.log(typeSet)
2、set的方法
2.1 add() 插入值
let typeSet = new Set();
typeSet.add(8);
typeSet.add("a").add("b").add("c");
console.log(typeSet)
2.2 delete() 删除
let typeSet = new Set([1,2,3,5,6,"a","v","c"]);
typeSet.delete(1);
console.log(typeSet)
2.3 has() 检测内部是否含有该值 返回布尔值
let typeSet = new Set([1,2,3,5,6,"a","v","c"]);
console.log(typeSet.has(1)) / true
2.4 size 属性 判断集合的长度
let typeSet = new Set([1,2,3,5,6,"a","v","c"]);
console.log(typeSet.size) ///8
2.5 clear() 清空内部所有的数据
let typeSet = new Set([1,2,3,5,6,"a","v","c"]);
typeSet.clear()
console.log(typeSet)
3、set 循环
map 和 set 都是iterator 接口机制,所以可以使用 for....of 进行遍历
3.1 for...of
let typeSet = new Set([1,2,3,5,6,"a","v","c"]);
for(let item of typeSet){
console.log(item)
}
使用 keys 和 values 遍历
let typeSet = new Set([1,2,3,"c"]);
for(let item of typeSet.keys()){
console.log(item)
}
let typeSet = new Set([1,2,3,"c"]);
for(let item of typeSet.values()){
console.log(item)
}
通过上面发现set结合的key和value是相同的
3.2 forEach 遍历
let typeSet = new Set([1,2,3,"c"]);
typeSet.forEach((item,index) => {
console.log(item,index)
})
forEach 遍历 item 和 index 也是相同的
3.3 entries 遍历
let typeSet = new Set([1,2,3,"c"]);
for(let item of typeSet.entries()){
console.log(item)
}
4、set 转换为数组
由于set不能使用数组的方法,虽然forEach可以用,但是仅仅是forEach方法,其他是不可以的,比如map、filter
所以如果想操作set中的数据,需要将set转换为数组
… 扩展运算符是有iterator接口机制,所以set就可以使用…运算符
let typeSet = new Set([1,2,3,"c"]);
console.log([...typeSet])
小案例:将数组中 数 * 2
let typeSet = new Set([1,2,3,6,8]);
let arr = [...typeSet];
let arr2 = arr.map(item => {
return item * 2
})
console.log(new Set(arr2))
小案例:数组去重
let typeSet = new Set([1,2,3,6,8,1,2,1,3]);
let arr = [...typeSet];
let arr2 = new Set(arr)
console.log(arr2);
WeakSet
1、介绍
Set和WeakSet的区别是set内部建议存放数组,WeakSet内部建议存放引用类型(数组和对象)
虽然WeakSet内部建议存放对象,但是WeakSet初始化的时候也不能进行初始化赋值,必须使用add赋值
set内部存放对象
let typeSet = new Set();
typeSet.add({
'a':1,
'b':2
})
console.log(typeSet);
WeakSet内部存放对象
let typeSet = new WeakSet();
typeSet.add({
'a':1,
'b':2
})
console.log(typeSet);
WeakSet是使用add方法进行的赋值,如果使用初始化赋值会报错
2、WeakSet 方法
WeakSet也是用add进行赋值的,但是内部接收的是引用类性质,不能是基本类型值
注意:WeakSet没有size属性,也没有clear方法,也不能使用for..of进行遍历