Map vs WeakMap
Map 和 WeakMap 的设计目标、引用强弱、遍历能力和使用场景对比。
#type / synthesis
#status / growing
#resource / javascript
#resource / ecmascript
[!info] related notes
- 所属 MOC: ES6 新特性 MOC, ECMAScript MOC
- 前置概念: Map, WeakMap, ECMAScript集合引用类型
- 相关场景: 手写 Vue reactive 和 watchEffect 的最小实现, Vue3 Proxy 响应式原理
Map vs WeakMap
主题范围
这篇笔记只对比 Map 和 WeakMap 的设计目标、引用语义、可遍历性和典型用途。
一句话结论
- Map:通用键值对容器,适合做字典、缓存、统计
- WeakMap:对象元数据容器,适合给对象挂私有数据且不妨碍回收
对比表
| 维度 | Map | WeakMap |
|---|---|---|
| 键类型 | 任意类型 | 只能对象 |
| 引用语义 | 强引用 | 弱引用 |
| 是否可遍历 | 可以 | 不可以 |
是否有 size | 有 | 没有 |
| 适合做通用字典 | 是 | 否 |
| 适合对象私有数据 | 可以,但要注意内存 | 更适合 |
为什么 WeakMap 不能遍历
因为 WeakMap 的键可能在任意时刻被垃圾回收,遍历结果不稳定,所以它故意不提供 keys()、values()、entries() 和 forEach()。
什么时候用 Map
- 键值对需要遍历
- 键可能是任意类型
- 需要统计数量
- 频繁增删
什么时候用 WeakMap
- 键必须是对象
- 想给对象附加隐藏数据
- 不想因为缓存导致对象无法回收
最短记忆方式
- Map = 通用字典
- WeakMap = 对象附属数据