Map vs WeakMap

Map 和 WeakMap 的设计目标、引用强弱、遍历能力和使用场景对比。

#type / synthesis #status / growing #resource / javascript #resource / ecmascript

[!info] related notes

Map vs WeakMap

主题范围

这篇笔记只对比 MapWeakMap 的设计目标、引用语义、可遍历性和典型用途。

一句话结论

  • Map:通用键值对容器,适合做字典、缓存、统计
  • WeakMap:对象元数据容器,适合给对象挂私有数据且不妨碍回收

对比表

维度MapWeakMap
键类型任意类型只能对象
引用语义强引用弱引用
是否可遍历可以不可以
是否有 size没有
适合做通用字典
适合对象私有数据可以,但要注意内存更适合

为什么 WeakMap 不能遍历

因为 WeakMap 的键可能在任意时刻被垃圾回收,遍历结果不稳定,所以它故意不提供 keys()values()entries()forEach()

什么时候用 Map

  • 键值对需要遍历
  • 键可能是任意类型
  • 需要统计数量
  • 频繁增删

什么时候用 WeakMap

  • 键必须是对象
  • 想给对象附加隐藏数据
  • 不想因为缓存导致对象无法回收

最短记忆方式

  • Map = 通用字典
  • WeakMap = 对象附属数据
创建于 2026/4/7 更新于 2026/5/27