WeakMap 是键必须为对象且弱引用的映射结构,不阻止垃圾回收,不可迭代、无 size、不能清空,适用于私有数据绑定与避免内存泄漏。

WeakMap 是 JavaScript 中一种特殊的键值对集合,它的核心作用是“为对象附加数据,但不干扰对象的生命周期”。它不是用来替代 Map 的通用容器,而是在特定场景下解决内存管理与数据隔离问题的工具。
键必须是对象,且只能是对象
WeakMap 的键不允许是字符串、数字、布尔值等原始类型,只接受对象(包括函数、数组、DOM 元素、类实例等)。
- ✅ 正确:
weakMap.set({ name: 'Alice' }, 'user') - ❌ 报错:
weakMap.set('Alice', 'user')→TypeError: Invalid value used as weak map key
键是弱引用,不阻止垃圾回收
这是 WeakMap 最关键的特性:如果一个对象仅作为 WeakMap 的键存在,且没有其他变量引用它,那么该对象会被正常回收,对应的键值对也自动消失(无法观测到删除过程)。
- 例如:
let obj = { id: 1 }; weakMap.set(obj, 'data'); obj = null;→ 后续 GC 可能立即回收obj,weakMap中那条记录也随之失效 - 这从根本上避免了因缓存或元数据绑定导致的内存泄漏
不可迭代、无 size、不能清空
WeakMap 是封闭的“黑盒”,设计上就禁止外部窥探或批量操作:
立即学习“Java免费学习笔记(深入)”;
- 没有
.keys()、.values()、.entries()方法,无法用for...of或forEach遍历 - 没有
.size属性,无法知道当前存了几项 - 没有
.clear()方法;如需清空,只能新建一个new WeakMap()
天然支持私有数据与安全映射
因为只有同时持有 WeakMap 实例和对应键对象,才能读写其值,所以它常被用于模拟私有字段:
- 类中保存实例专属状态,不暴露在
this上,也无法被for...in或Object.keys()枚举 - 框架或库中为第三方对象(如 DOM 节点)添加配置、状态标记,而无需修改原对象
- 即使使用 ES2022 的
#private字段,WeakMap 在跨模块或兼容旧环境时仍有不可替代价值











