ES6——WeakMap

83 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

WeakMap(弱映射)含义

WeakMap(弱映射)是ES6中新增的一种集合类型,它与Map结构类似,也是用于生成键值对的集合,我们知道在Map类型中可以接受任何类型作为键名,但是WeakMap类型中的键名只能是对象类型(当然不包括null),不接受其他类型的值作为键名,如下:

const map = new WeakMap();
map.set(1, 2)

image.png

在上述例子中,创建一个WeakMap数据map,然后向其中添加一个键名为1,值为2的数据,执行代码后抛出TypeError错误。但如果向WeakMap中添加一个键名为对象的数据,则会执行成功,如下:

const map = new WeakMap()
const key = { name: 'wang' }
map.set(key, 2)

image.png

上述例子中,向WeakMap数据中添加一个键名为对象{ name: 'wang' },值为2的数据,在控制台打印可以看出WeakMap中已经包含此数据。

此外,WeakMap类型的数据和Map还有一点不同,就是WeakMap类型中的键名所引用的对象,不计入javaScript垃圾回收机制中,这点和WeakSet中对对象的弱引用是一样的。

WeakMap中的实例方法

WeakMap中主要有以下几种方法可以使用:

  • WeakMap.prototype.set(key, value):设置WeakMap的键值对,并返回WeakMap数据
  • WeakMap.prototype.get(key):获取WeakMap中的某个键名对应的值
  • WeakMap.prototype.has(key):检测WeakMap中是否有某个键名,返回布尔值
  • WeakMap.prototype.delete(key):删除某个键名的成员,返回布尔值 上述方法的用法如下代码所示:
const map = new WeakMap()
const key = { name: 'wang' }
map.set(key, 2)
map.get(key) // 2
map.has(key) // true
map.delete(key) // true

因为WeakMap中键名对象为弱引用,js垃圾回收时不会判断WeakMap是否还存在此对象的引用,如果其余代码中没有此对象的应用,那么其占用的内存将会被回收,WeakMap中此对象对应的键名也将会消失,所以,在WeakMap中某个键名是否存在是依赖于垃圾回收机制,是不可预测,因此,WeakMap中没有size属性,也没有遍历操作。