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) ,是否包含该键