Weakmap 是键必须为对象且弱引用的集合,不阻止垃圾回收,不可遍历、无 size 属性,适用于绑定元数据而不影响对象生命周期。

WeakMap 是 javaScript 中一种特殊的键值对集合,它的核心特点是:键必须是对象,且对键的引用是“弱”的 —— 不会阻止垃圾回收器(GC)回收该对象。这使它和 Map 在行为、用途和限制上存在本质区别。
键只能是对象,原始值直接报错
WeakMap 不接受字符串、数字、布尔值等原始类型作为键,否则会抛出 TypeError:
const wm = new WeakMap();
wm.set(“hello”, “world”); // ❌ 报错:Invalid value used as weak map key
wm.set({}, “data”); // ✅ 合法,键是空对象
这是因为“弱引用”只在对象层面有意义;原始值没有内存地址和引用关系,无法被弱持有。
立即学习“Java免费学习笔记(深入)”;
键是弱引用,不阻碍垃圾回收
这是最根本的区别:
- Map 对键保持强引用:只要 Map 还存在,哪怕外部已无任何变量指向该对象,它也不会被 GC 回收。
- WeakMap 对键是弱引用:如果一个对象仅被 WeakMap 引用,而其他地方都已释放对该对象的引用,那么 GC 可以随时回收它,WeakMap 中对应的键值对也会自动消失。
这个特性让它天然适合做“附着式元数据”——比如给某个 dom 元素存私有状态,又不想因此拖住元素不被销毁。
没有遍历能力,也没有 size 属性
WeakMap 故意不提供以下功能:
- 不能用
for...of、keys()、values()、entries()遍历 - 没有
size属性,无法知道当前存了几条 - 没有
clear()方法(规范已弃用)
这些限制不是疏漏,而是设计使然:避免开发者误以为能“观察”或“控制”这些弱关联的数据,也防止因遍历触发意外的内存驻留。
典型使用场景
WeakMap 的定位很明确:当你需要把一些数据和某个对象绑定,但又不希望这种绑定影响对象的生命周期时,就用它。
- 为类实例添加真正的私有字段(ES2022 的 # 私有字段出现前的常用模式)
- 缓存计算结果,键是输入对象,对象销毁后缓存自动失效
- 存储 DOM 节点的临时状态或配置,页面卸载时无需手动清理
基本上就这些。WeakMap 不是 Map 的“轻量版”,而是一种不同哲学的数据结构:它不管理数据的生命周期,而是让数据随对象自然消亡。