ES6-map&reduce


Map

1. 传统对象结构

Map本质上是一个键值对的集合。和传统对象结构相比,传统的对象只能用字符串作为键名,这就在使用上造成了很大的限制了。这也是新增 Map 的原因之一。

2. Map 结构

Map类似于对象,但是键名不限于字符串,可以说Object结构提供键-值对应,Map结构提供值-值对应因此其实采用map结构会优于传统对象

3. Map 的特点

  1. Map 默认情况下不包含任何键,所有键都是自己添加进去的。不同于 Object 原型链上有一些默认的键。

  2. Map 的键可以是任意类型数据,就连函数都可以。

  3. Map 的键值对个数可以轻易通过size属性获取,Object 需要手动计算。

  4. Map 在频繁增删键值对的场景下性能要比 Object 好。

4. 什么时候用 Map

  1. 要添加的键值名和 Object 上的默认键值名冲突,又不想改名时,用 Map
  2. 需要 String 和 Symbol 以外的数据类型做键值时,用 Map
  3. 键值对很多,有需要计算数量时,用 Map
  4. 需要频繁增删键值对时,用 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
2
let map = new Map()
let arr = [...map]

数组转为 Map

1
let map = new Map(arr)

Map 转为对象

通过遍历利用set将键值对加入对象中

1
2
3
4
let obj = {}
for (let [k, v] of map) {
obj[k] = v
}

对象转为 Map

1
2
3
for( let k of Object.keys(obj)){
map.set(k,obj[k])
}

五、什么是 WeakMap ?

总所周知,WeakMap是 ES6 中新增的一种集合类型,叫做“弱映射”。它和Map是兄弟关系,与Map的区别就在于这个弱字,API 还是Map的那套(只有set get has delete)
那它真正是什么意思呢?

这其实描述的是 JS 中垃圾回收程序对待“弱映射”中键的方式

六、WeakMap 的特性

我们先从 WeakMap 的特性讲起

  1. WeakMap 只能将对象作为键名
    只接受对象作为键名(null 除外),不接受其他类型的值作为键名
    null 除外
  2. WeakMap 的键名引用的对象是弱引用
    这里懵了挺久的,但是这是WeakMap结构的关键所在

要想读懂这句话,不容易,我们需要先知道强引用和弱引用

在上面我们谈到强引用数据被删除时,需要手动解除引用,而弱引用则可以等待垃圾回收机制自动清除

总的来说, WeakMap 保持了对键名所引用的对象的弱引用,即垃圾回收机制不将该引用考虑在内。只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。

七、Map 和 WeakMap 的区别

看到这里相信心中已经有答案了

1.Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键
2. Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的
3. Map 可以被遍历, WeakMap 不能被遍历

参考文章

浅析 Map 和 WeakMap 区别以及使用场景


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!