一、什么是Set
1)Set是一种叫做集合的数据结构。这句话的重点在于集合,那么什么是集合的?它又有什么特点呢?集合是由一组无序且唯一的项组成的,即是一个没有重复元素也没有顺序概念的数组
2)Set本身是一个构造函数,用来生成Set数据结构
二、Set的使用以及其实例的属性和方法
当我们要定义一个Set数据结构时:
const setData = new Set()
setData.add('111')
// 或
const setData = new Set([111])
1、属性:
- size:返回集合所包含元素的数量
2、操作方法:
- add(value):向集合添加一个新的项
- delete(value):从集合移除某个值
- has(value):判断集合是否存在某个值,返回true/false
- clear():移除集合里所有项
3、遍历方法:
- keys():返回一个包含集合中所有键的数组
- values():返回一个包含集合中所有值得数组
- entries():返回一个包含集合中所有键值对的数组
- forEach():用于对集合成员执行某种操作,没有返回值
4、注意点:
- 向Set加入值时,不会发生类型转换。Set内部判断两个值是否不同使用的算法类似于精确相等运算符===,唯一不同的是向Set多次添加NaN时,只会加入一个,而NaN!===NaN时返回的是false
- 向Set加入的值为对象类型时,不会对相同类型的值进行去重
- Set的遍历顺序就是插入顺序,可利用这个特性保存一个回调函数列表,调用时就能保证按照添加顺序调用
- Set结构没有键名,只有键值(或者说键名和键值是同一个值)所以keys()方法和values()方法的行为完全一致 set.keys()和set.values()
- 可以通过Array.from或者扩展运算符...将Set结构转为数组
三、什么是Map?
Map数据结构类似于对象,也是键值对的集合,那么对象和Map有什么区别呢?
- 首先最明显得区别就是对象只能用字符串当做键,map的键是不限于字符串的,各种类型的值都可以当做键值
- Map中的键值是有序的,而添加到对象中的键则不是
- Map的键值对个数可以从size属性获取,而对象的键值对个数只能手动计算
- 对象都有自己的原型,原型链上的键名有可能和自己在对象上设置的键名产生冲突
四、Map的使用以及其实例的属性和方法
1、当我们想创建一个Map时,可以通过
const mapData1= new Map([
['foo', 1],
['bar', 2]
]);
//或者
const mapData2 = new Map()
mapData2.set('foo',1)
mapData2.set('foo',1)
2、属性:
- size:返回字典所包含的元素个数
3、操作方法:
- set(key,val):向字典中添加新元素
- get(key):通过键值查找特定的数值并返回
- has(key):判断键值是否存在字典中,返回true/false
- delete(key):通过键值从字典中移除对应的数据
- clear():将这个字典中的所有元素删除
4、遍历方法:
- keys():将字典中包含的所有键名以数组形式返回。
- values():将字典中包含的所有数值以数组形式返回。
- forEach():遍历字典的所有成员,可以接受两个参数,第二个参数用来绑定this
- entries():返回所有成员,效果和for(let [key,value] of map){}一致
5、注意点:
- Map的遍历顺序就是插入顺序
- Map的键是跟内存地址绑定的,只要内存地址不一样,就视为两个键。好处是扩展别人的库时,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
- 如果键名是一个简单类型的值,则只要两个值严格相等,则视为一个键。如-0和+0为一个键
- 但是两个NaN虽然不严格相等,还是会视为同一个键。
五、应用场景
1)由于Set的值是唯一的,所以可以用来做数组的去重
2)当我们在业务开发中遇到需要通过多次数组循环才能找到对应的值时,可以考虑将数据存储为Map结构,这样可以方便我们根据key值快速获取到对应的value值。
六、简单了解WeakSet、WeakMap
前面了解完Set结构和Map结构后,现在来简单了解一下WeakSet、WeakMap结构吧。
1、WeakSet:
- 成员都是对象
- 成员都是弱引用,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,可以用来保存DOM节点,不容易造成内存泄漏。
- 不能遍历,方法有add、delete、has
2、WeakMap:
- 只接受对象作为键名(null除外),不接受其他类型的值作为键名
- 键名是弱引用,键值可以是任意的,键名所指向的对象不计入垃圾回收机制
- 不能遍历,方法有get 、set 、has、delete