在ES6中,提供了新的数据结构set,set类似于数组,但是其中的元素是不能重复的。我们先来看个例子:
初始化
|
|
初始化也可以接受数组为入参
|
|
刚才讲到,set中所有的元素是不能重复的,那么,怎么定义重复呢?set使用的方法类似于 ===,只有一个特例,NaN, 精确相等任务NaN不等于自身,而set中认为是相等的。
看几个例子,就一目了然了:
|
|
属性
属性有两个:
- construct 默认是Set函数
- size, 即set中元素的数量
方法
set有四个操作方法:
- add() 返回set本身
- delete() 返回删除是否成功的布尔值
- has() 返回set中是否某个元素
- clear() 情况set,没有返回值
这里要注意的是,delete和has中判断两个元素是否相同的方法和初始化中的方法一致,所以尤其要注意对象的判断,基本类型基本不会有问题。
set有四个遍历方法:
- keys(): 返回所有的key
- values(): 返回所有的value
- entries(): 返回所有的键值对
- forEach(): 回调函数遍历, 和数组用法一致
因为set中本身没有key,value之分,所key和value都是set中元素本身,我们来看下例子:
|
|
weakSet
weakSet和set类似,只有两个区别:
- 元素只能是对象
- 对象都是弱引用,即js的垃圾回收机制不会考虑weakSet中的引用
因为第一个特点,所以weakSet不能使用遍历、size等方法和属性(因为遍历的时候可能对象已经被释放了)
用法
set可以用来实现去重等功能,比如:
|
|
weakSet在互联网上找到的内容不多,阮一峰的《ES6标准入门》中提到,可以用来保存DOM节点,而不用担心节点移除时引起内存泄露。