跳到主要内容

WeakMap

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

WeakMap是一种键值对的集合,类似于Map。不过,WeakMap与Map有几个重要的区别:

  • 在WeakMap中,只有对象可以作为键。换句话说,我们不能使用基本类型(如数字,字符串,布尔值等)作为WeakMap的键。
  • WeakMap的键是弱引用的。这意味着,如果一个对象只被WeakMap引用,那么这个对象可以被垃圾回收(GC)。当这个对象被垃圾回收后,它对应的键值对也会从WeakMap中自动移除。
  • WeakMap不可遍历,也就是说,我们不能使用像for...of这样的循环来遍历WeakMap。

由于这些特性,WeakMap在处理内存泄漏问题和管理对象私有数据等场景中有着显著的优势。

WeakMap 使用

我们可以使用new WeakMap()来创建一个新的WeakMap。在创建了WeakMap之后,我们可以使用set方法来添加新的键值对,

使用get方法来获取某个键对应的值,使用delete方法来移除某个键及其对应的值,使用has方法来检查WeakMap中是否存在某个键。

let people = { name: "coolFish" };

let weakMap = new WeakMap();

weakMap.set(people, "ok"); // 正常工作(以对象作为键)

weakMap.set("test", "Whoops"); // Error,因为 "test" 不是一个对象

people = null; // 覆盖引用 // people 被从内存中删除了!

我们可以发现,如果people 只是作为 WeakMap 的键而存在,他们会被从 map 中自动删除。 WeakMap 不支持迭代以及 keys(),values() 和 entries() 方法。所以没有办法获取 WeakMap 的所有键或值。 我们可以用下面几个方法,获取一些我们想要的信息

  • weakMap.get(key) ,拿键取值。
  • weakMap.set(key,value) ,设置weakMap
  • weakMap.delete(key) ,根据键删除值
  • weakMap.has(key) ,是否包含该键