1、Set
Set是一个构造函数,我们平时用是Set的实例
Set.prototype.constructor等同于Set()
Set.prototype等同于new Set() Set有三个特性:
(1)结构中不会存在相同的值
(2)可以接受数组作为参数
(3)Set不会进行隐形转换,也就是说1和"1"是两个值,这和===类似,不同的是,Set认为NaN和NaN相等,而全等不是。
需要注意的是两个对象永远不相等。那么,我们先new一个set吧!
const s=new Set()
Set的方法有5个,分别是:
s.size//返回s中成员的个数
s.add(value) //向s中添加成员
s.delete(value)//从s中删除指定成员,返回布尔值,表示是否删除成功
s.has(value)//询问s中是否存在指定成员,返回布尔值,表示是否存在
s.clear()//完全清空s,不返回
将Set数据结构转换为数组有两种方法:
(1)[...new Set(array)]
(2)Array.from(new Set(array))
遍历Set有四种方法
(1)s.keys()//返回键名
(2)s.values()//返回键值
(3)s.entries()//返回键值对
(4)s.foreach()//根据回调函数遍历
当你看到这里时,恭喜你!因为除了最后一条都是废话。首先Set中都是由值组成的,不存在键值对,也就是说(1)和(2)的返回的结果完全相同。而(3)返回的是由两个值组成的数组,像["1","1"]这样。是不是很没用?最没用的是Set默认允许遍历,默认方法是keys(),也就是说你可以像遍历数组一样用for...of遍历Set!不过如果以后有面试官问起来,为什么可以用遍历数组的方法遍历Set,这个时候你可以大声的告诉他,因为默认方法是keys() 实际上for(let item in s)其实是for(let item in s.keys()),是不是很cool
2、WeakSet
其实WeakSet和Set基本差不多,也是构造函数,那我就说一些不同的吧
(1)WeakSet只能存储对象,存其他的会报错
(2)WeakSet中的对象都是弱引用,也就是说不会被垃圾回收机制计算引用次数(不知道垃圾回收机制的同学请自行大红书,上面都有),而垃圾回收机制依赖引用次数,这样的好处就是节约回收成本。举个例子,出于某个需求,你需要储存一个DOM对象,在某个时间点,你从DOM tree上移除了这个节点,如果是Set的话,这就叫浪费内存,优化的话可以从这里着手哦!手动敲黑板。而WeakSet就不同了,因为是弱引用嘛,用完自动回收。
老规矩,先new一个WeakSet
const ws=new WeakSet()
WeakSet的方法有三个,分别是:
(1)ws.add(value)//
(2)ws.delete(value)//
(3)ws.has(value)//和上面一样 就不多说了
要注意的是WeakSet没有size,因为他是不可遍历的,因为里面的对象都是弱引用,随时会消失,不可控。
好了,今天的分享就到这里,希望能够帮到大家的同时,也希望大家能够对我片面的理解有所指正,感谢看到这里。