Map、WeakMap
一、Map
类似于对象,也是键值对的集合,由于ES6之前对象的键只能是字符串,所以为了解决这种限制推出了Map。
ES6之后对象的key也支持了其他类型
添加成员时,如果key相同,后来的value会覆盖之前的value,判断key是否相同类似于严格相等(===
)
Map对key是否相同与严格相等(
===
)区别:
0和-0:Map是同一个key,
===
认为不相等NaN和NaN:Map是同一个key,
===
认为不相等
1、实例属性及方法
Map.prototype.set(key, value)
Map.prototype.get(key)
Map.prototype.has(key)
Map.prototype.delete(value)
Map.prototype.clear()
Map.prototype.size
2、遍历方式
Map.prototype.forEach((value, key, set) => {}, thisArg) 【推荐】
Map.prototype.entries()
Map.prototype.keys():Map.prototype.values的别名
Map.prototype.values()
注意:Map的遍历顺序就是插入顺序
3、数据类型转换
todo
二、WeakMap
1、只能用对象作为key
2、key是弱引用
Map的key是对象,使用完很容易忘记清除,增加内存泄漏的风险,WeakMap就是为解决此问题而诞生的。WeakMap的key都是弱引用(这也是叫Weak的原因),即不参与引用计数,垃圾回收机制运行时直接忽略此处引用。
注意:WeakMap 弱引用的只是key,value依然是正常引用。
3、无法遍历
因为key又可能随时会被回收,所以WeakMap内部的成员数量不稳定,所以没有提供size属性,也不支持遍历。
三、区别
成员类型
不限
对象
成员函数和属性
Map.prototype.set(key, value)
Map.prototype.get(key)
Map.prototype.has(key)
Map.prototype.delete(key)
Map.prototype.size
Map.prototype.clear()
Map.prototype.forEach()
Map.prototype.values()
Map.prototype.keys()
Map.prototype.entries()
WeakMap.prototype.set(key, value)
WeakMap.prototype.get(key)
WeakMap.prototype.has(key)
WeakMap.prototype.delete(key)
遍历
支持
不支持
适用场景
对key的类型要求宽松,尽量替代对象
不关心垃圾回收机制(比如存储DOM节点)
参考:
Last updated