5月27日 01:16

WeakSet、WeakMap 和 Set、Map 之间的区别是什么?

核心区别就一条:Weak 版本的 key(或元素)是弱引用,不阻止垃圾回收。

Set vs WeakSet

  • Set 元素可以是任何类型;WeakSet 元素只能是对象
  • Set 可迭代(forEachsizekeys);WeakSet 不可迭代
  • Set 中对象被引用着,即使对象其他地方不再使用也不会被 GC;WeakSet 中对象没有其他引用时会被回收

Map vs WeakMap

  • Map 的 key 可以是任何类型;WeakMap 的 key 只能是对象
  • Map 可迭代;WeakMap 不可迭代
  • WeakMap 条目会随 key 对象被 GC 而自动清除

WeakMap 典型场景:Vue 3 的响应式依赖追踪、存储 DOM 节点的关联数据、为第三方对象附加元数据而不造成内存泄漏。WeakSet 用得少——需要标记"这个对象我见过"但不想阻止它被 GC 时用。

追问

为什么 WeakMap 没有 size 属性?

因为 WeakMap 中条目可能随时被 GC 回收,size 值是瞬时的、不可靠的。如果 JS 引擎提供了 size,开发者的代码里依赖了这个值,但下一秒 GC 跑了一次值变了——这种不可预测性比没有 size 更糟糕。

WeakMap 和 Map 在内存管理上有什么区别?

Map 的 key 被引用着,即使这个 key 对象在别处都已不使用,Map 里的引用也会阻止 GC——内存泄漏风险。WeakMap 的 key 是弱引用,如果 key 对象没有其他强引用了,GC 可以回收,对应的 WeakMap 条目自动消失。

标签:前端ES6