ES6-map&reduce
Map
1. 传统对象结构
Map本质上是一个键值对的集合。和传统对象结构相比,传统的对象只能用字符串作为键名,这就在使用上造成了很大的限制了。这也是新增 Map 的原因之一。
2. Map 结构
Map类似于对象,但是键名不限于字符串,可以说Object结构提供键-值对应,Map结构提供值-值对应因此其实采用map结构会优于传统对象
3. Map 的特点
Map 默认情况下不包含任何键,所有键都是自己添加进去的。不同于 Object 原型链上有一些默认的键。
Map 的键可以是任意类型数据,就连函数都可以。
Map 的键值对个数可以轻易通过size属性获取,Object 需要手动计算。
Map 在频繁增删键值对的场景下性能要比 Object 好。
4. 什么时候用 Map
- 要添加的键值名和 Object 上的默认键值名冲突,又不想改名时,用 Map
- 需要 String 和 Symbol 以外的数据类型做键值时,用 Map
- 键值对很多,有需要计算数量时,用 Map
- 需要频繁增删键值对时,用 Map
Map 实例属性和方法
1. set
set方法设置键名key对应的键值为value,然后会返回整个Map结构,如果设置的key已经存在,则会更新value值,否则会新生成该键
2. get
通过get方法读取key对应的键值,如果传入的键值不存在,则会返回undefined
3. has
判断传入的键是否存在当前Map对象中,该方法返回一个布尔值
4. delete
删除传入的键,返回true,如果删除失败,则返回false
5. clear
清除所有成员,没有返回值
三、遍历方法
可以采用for…of循环和forEach两种方法。由于Map实例会维护键值对的插入顺序,因此可以根据插入顺序进行遍历
采用for…of
for…of可以遍历有iterator接口的数据结构
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
map.entries()
在Map实例中有一个迭代器,能以插入顺序生成[key,value]形式的数据。
我们可以通过entries方法来获得这个迭代器,从而利用for…of进行遍历操作
map.values()
可以采用遍历map.values()的方式来遍历map容器的属性值
map.keys()
可以采用map.keys()来遍历键名
采用 forEach() 回调遍历
四、Map 类型转化
几种与map相互类型转化的方法
Map 转为数组
通过扩展运算符实现
1 |
|
数组转为 Map
1 |
|
Map 转为对象
通过遍历利用set将键值对加入对象中
1 |
|
对象转为 Map
1 |
|
五、什么是 WeakMap ?
总所周知,WeakMap是 ES6 中新增的一种集合类型,叫做“弱映射”。它和Map是兄弟关系,与Map的区别就在于这个弱字,API 还是Map的那套(只有set get has delete)
那它真正是什么意思呢?
这其实描述的是 JS 中垃圾回收程序对待“弱映射”中键的方式
六、WeakMap 的特性
我们先从 WeakMap 的特性讲起
- WeakMap 只能将对象作为键名
只接受对象作为键名(null 除外),不接受其他类型的值作为键名
null 除外 - WeakMap 的键名引用的对象是弱引用
这里懵了挺久的,但是这是WeakMap结构的关键所在
要想读懂这句话,不容易,我们需要先知道强引用和弱引用
在上面我们谈到强引用数据被删除时,需要手动解除引用,而弱引用则可以等待垃圾回收机制自动清除
总的来说, WeakMap 保持了对键名所引用的对象的弱引用,即垃圾回收机制不将该引用考虑在内。只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
七、Map 和 WeakMap 的区别
看到这里相信心中已经有答案了
1.Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键
2. Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的
3. Map 可以被遍历, WeakMap 不能被遍历
参考文章
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!