第六章 JavaScript标准库 6.12 WeakMap

90 阅读2分钟

6.12 WeakMap

WeakMap 和 Map 最主要的区别在于键的引用方式和生命周期。具体来说:

  • 1 键只能是对象(包括函数),不能是原始类型的值(数字、字符串、布尔值等),因为原始类型的值没有引用类型,也就无法被垃圾回收机制追踪。
  • 2 WeakMap 的键是弱引用,即只要没有其他引用指向键对象,垃圾回收机制就会自动回收该键及其对应的值。这意味着,WeakMap 的键不会影响对象的垃圾回收,不会造成内存泄漏。而 Map 的键是强引用,只有在 Map 被销毁时,对应的键值对才会被回收。
  • 3 WeakMap 没有 size 属性和遍历方法(keys、values 和 entries 方法),因为键的生命周期不确定,可能随时被回收,也就无法确定键值对数量和顺序。因此,WeakMap 只提供了 get、set、has 和 delete 方法。
  • 4 WeakMap 不能直接迭代,只能使用 for...of 配合 entries 方法进行迭代。 综上所述,WeakMap 主要用于存储键值对,且键值对的生命周期不确定、可能随时被回收的场景。而 Map 则适用于所有需要键值对集合的场景。 下面是一个简单的 WeakMap 示例:
let wm = new WeakMap();

let obj1 = {};
let obj2 = {};

wm.set(obj1, 'foo');
wm.set(obj2, 'bar');

console.log(wm.get(obj1)); // "foo"
console.log(wm.get(obj2)); // "bar"

obj1 = null;

console.log(wm.get(obj1)); // undefined
console.log(wm.get(obj2)); // "bar"

在这个例子中,我们创建了一个 WeakMap 实例 wm,并用两个空对象作为键分别绑定了两个值 "foo" 和 "bar"。然后我们输出了两个键的值,并将 obj1 设置为 null。由于 obj1 不再存在于内存中,因此与之关联的键值对也被垃圾回收了,再次获取 obj1 对应的值时,得到的是 undefined。而与 obj2 关联的键值对则仍然存在于 wm 中,可以正常访问其对应的值 "bar"。