set类型
定义及声明方式
set类型类似数组,但set内的元素不会有重复
let set = new Set();
set.add(1);
set.add("1");
console.log(set); => [1,'1']
set类型的增删改查
let set = new Set (['csdn','github']);
console.log(set.values()); => SetIterator{['csdn','github'}
//获取set类型的元素
console.log(set.size); => 2
//获取set类型的长度
console.log(set.has("csdn"));
//判断set类型中元素是否存在
console.log(set.delete('csdn')); => true
//在set类型中查找并删除某元素,若删除成功返回true,若元素不存在返回false
set.clear();
//清空set类型
类型之间的转换
数组转为set类型
let set = new Set(arr);
set类型转为数组
let arr = [...set];
set类型使用数组的方法过滤
let set = new Set('123456789');
let arr = [...set].filter(item=> item < 5);
set = new Set(arr);
console.log(set); => {1,2,3,4};
arr数组使用set去重
let arr = [1,2,3,3,4,5,3,1];
let arr = [...new Set(arr)];
遍历set类型
let set = new Set('csdn','github');
set.forEach((value, key.set)=>{
console.log(value)
})
//value和key一样
for (let value of set) {
console.log(value);
}
set类型的应用
let obj = {
data:new Set(),
keyword(word){
this.data.add(word);
},
show() {
let ul = document.querySelector('ul');
ul.innerHTML = '';
this.data.forEach(item=>{
ul.innerHTML += `<li>${ item}</li>`
});
}
}
let input = document.querySeletor('[name = csdn]');
input.addEventListener('blur',function(){
obj.keyword(this.value);
obj.show();
})
set类型处理并集交集与差集
let a = new Set([1,2,3,4,5]);
let b = new Set([4,5,3,8]);
console.log(new Set([...a, ...b])); => { 1,2,3,4,5,8 }
//并集
new Set( [...a].filter(item=> b.has(item) ) ); => { 3,4,5 }
//交集
new Set([...a].filter(item)=> !b.has(item)); => { 1,2 }
//差集,存在a中并不存在b中的元素
weakset
定义及声明
定义:与set类型相似,里面的值只能存放引用类型数据(存放基本类型数据会报错)
let set = new WeakSet;
set.add(["NY","NN"]);
可使用weakset类型存储dom元素
let nodes = new WeakSet();
let divs = document.querySelectorAll('div');
divs.forEach(item=>{
nodes.add(item);
});
nodes.delete(div[0]);
console.log(nodes.has(div[0])); => false
weakset集合只能存储对象的弱引用,并且不可以储存原始值;
集合中的弱引用如果是对象的唯一的引用,则会被回收并释放相应内存
weakset 集合不可跌迭代,把所以不能被遍历,也不支持size属性,这其实是为了让它能够正确地处理内存中的数据。故,如果你只需要跟踪对象的引用,那么更应该使用weakset集合。