今天我们来介绍一下数据结构Set和weakset
Set其实类似于数组,但是其中的成员值都是唯一的,没有重复的值。
如何构造一个Set?
Set本身也是一个构造函数,用来生成Set,其参数可以是空,可以是数组,可以是类似数组的对象(比如NodeList)
如果不清楚NodeList可以看这篇文章:
(4条消息) javascript 中的nodeList理解_我只是搬运工的博客-CSDN博客_js listnode
构造Set时的不同参数类型如下代码举例:
//参数为空
let set=new Set();
//参数为数组
let a=new Set([2,3,4,5,6,6,8,NaN,NaN,{},{}])
//参数是类似数组的对象
let tem=document.querySelectorAll('p')
==Set去重的依据是什么呢?==
类似于“===”,但是有几个不同之处:
在Set中,两个NaN是相等的,两个空对象是不相等的。
Set有四个主要的操作方法:add()、delete()、has()、clear()
因为keys、values、entries返回的都是迭代器,所以无法直接得到键名或键值,如果想要获得键名或键值,我们可以使用for…of
let a=new Set([2,3,4,5,6,6,8,NaN,NaN,{},{}])
for(let i of a.keys()){
console.log(i)
}
数组去重
let change=function (arr){
return Array.from(new Set(arr))
}
change([1,1,2,4,4,6])
let set=new Set();
[1,2,3,4,4].forEach(x=>set.add(x))//会去重
console.log(set)
=>使用扩展运算符…
let a=new Set([2,3,4,5,6,6,8,NaN,NaN,{},{}])
console.log(a)// Set(9) { 2, 3, 4, 5, 6, 8, NaN, {}, {} }
console.log([...a]) //[2, 3, 4, 5, 6, 8, NaN, {}, {}]
然后我们试着利用Set和map来修改Set中的值:
let b=new Set([1,1,3,4,5,5,6,8])
let c=new Set([...b].map(x=>x*2))
console.log(c) // Set(6) { 2, 6, 8, 10, 12, 16 }
WeakSet的使用其实和Set比较类似,他们的区别主要有两个:
什么叫弱引用呢,就是如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
WeakSet有三个方法:
因为WeakSet不可遍历,WeakSet没有size
属性,没有forEach方法。
关于Set的用法可以参考这篇博客: