WeakMap
WeakMap 是一组键值对的集合,其中键是弱引用。键必须是对象,但值可以是任意的。
Why WeakMap
在 JavaScript 里,
mapAPI 可以通过使其四个 API 方法共用两个数组(一个存放键,一个存放值)来实现。给这种map设置值时会同时将键和值添加到这两个数组的末尾。从而使得键和值的索引在两个数组中相对应。当从该map取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。
这样实现会有两个很大的缺点:
- 赋值和搜索操作都是
的时间复杂度( 是键值对的个数),因为这两个操作都需要遍历整个数组来进行匹配 - 可能导致内存泄漏,因为数组会一直引用着每个键和值。这种引用使得垃圾回收算法不能回收处理它们,即使没有其它任何引用存在
相比之下,WeakMap 的键是弱引用,这意味着没有其它引用时,垃圾回收能正常进行。
Cons
WeakMap 的 key 是不可枚举的。如果 key 是可枚举的话,其集合将会受垃圾回收机制影响,从而得到不确定的结果。
Use Case
如果你的键值对集合使用的 key 是对象的话,那么就应该使用 WeakMap。
ts
const target = {}
const value = 1
const map = new WeakMap()
map.set(target,value)