Map本质上是一个键值对的集合。和传统对象结构相比,传统的对象只能用字符串作为键名,这就在使用上造成了很大的限制了。这也是新增 Map 的原因之一。Map类似于对象,但是键名不限于字符串,可以说Object结构提供键-值对应,Map结构提供值-值对应因此其实采用map结构会优于传统对象.
Map 的特点:
- Map 默认情况下不包含任何键,所有键都是自己添加进去的。不同于 Object 原型链上有一些默认的键。
- Map 的键可以是任意类型数据,就连函数都可以。
- Map 的键值对个数可以轻易通过size属性获取,Object 需要手动计算。
- Map 在频繁增删键值对的场景下性能要比 Object 好。
**WeakMap **
WeakMap是 ES6 中新增的一种集合类型,叫做“弱映射”。它和Map是兄弟关系,与Map的区别就在于这个弱字,API 还是Map的那套(只有set get has delete).
- WeakMap 只能将对象作为键名,null 除外。
- WeakMap 的键名引用的对象是弱引用。(强引用必须手动删除引用,否则会造成内存泄露。弱引用:不能确保其引用的对象不会被垃圾回收机制回收的引用,一个对象若只被若引用所引用过,则被认为是不可访问的)
- 不可遍历,WeakMap对键名所引用的对象是弱引用关系,因此WeakMap内部成员是会却决于垃圾回收机制有没有执行,运行前后成员个数很可能是不一样的,而垃圾回收机制的执行又是不可预测的,因此不可遍历.
- 使用场景:① DOM节点元数据 ②部署私有属性 ③ 数据缓存
总结,Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键。Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的。Map 可以被遍历, WeakMap 不能被遍历。