WeakMap 是键为弱引用对象的集合,用于自动关联数据与对象生命周期;键只能是对象或 Symbol,不可遍历、无 size、不支持原始值,适用于私有属性、DOM 元信息、对象缓存等需自动清理的场景。

WeakMap 是 JavaScript 中一种特殊的键值对集合,它的核心特点是“键为弱引用的对象”,主要用于在不干扰垃圾回收的前提下,将数据与对象关联起来。
WeakMap 的关键特性
它不是普通 Map 的简化版,而是一个有明确设计意图的工具:
- 键只能是对象(包括函数、数组、DOM 节点等),不能是字符串、数字、布尔值或 null;Symbol 从 ES2023 起也支持作为键
- 键是弱引用:如果一个对象只被 WeakMap 引用,没有其他变量指向它,该对象会被垃圾回收器自动清理,对应键值对也随即消失
- 不可遍历:没有 keys()、values()、entries() 方法,也不能用 for...of 或 forEach 遍历
- 没有 size 属性,无法直接获知内部有多少条记录
- 只提供四个基础方法:set(key, value)、get(key)、has(key)、delete(key)
它最典型的特殊用途
WeakMap 解决的是“生命周期绑定”问题——让附加数据的生命期自动跟随目标对象,避免手动清理和内存泄漏:
- 为类实例添加真正私有的属性:外部代码无法访问 WeakMap 实例,也就无法读写存于其中的“私有字段”,且实例销毁后数据自动清空
- 给 DOM 节点挂载元信息:比如存储某个节点是否已绑定事件、是否处于加载中状态;节点从文档移除后,相关数据自然释放,不用再调用 cleanup
- 缓存基于对象的计算结果:例如对某个配置对象做深度解析,结果缓存在 WeakMap 中;一旦配置对象被丢弃,缓存同步失效,不会残留无用数据
- 避免循环引用导致的内存泄漏:在观察者模式、代理封装、依赖追踪等场景中,用 WeakMap 替代普通 Map 可防止目标对象因被长期引用而无法回收
WeakMap 的主要限制
这些限制不是缺陷,而是弱引用机制的必然结果,使用前需明确接受:
立即学习“Java免费学习笔记(深入)”;
- 不能用原始值(如 "id123"、42)作键,否则抛出 TypeError
- 无法枚举内容,也就无法调试查看全部键值对,也无法做批量操作(如清空所有缓存)
- 无法预测某条数据何时消失——只要键对象失去强引用,它就可能在下次垃圾回收时被清除,行为不可控
- 不能序列化(JSON.stringify 会忽略 WeakMap),也不适合用于服务端持久化或跨环境传递
- 不适用于需要稳定长期存储的场景,比如用户偏好设置、路由状态缓存等
WeakMap 不是用来替代 Map 或 Object 的通用容器,而是专为“临时、依附、自动清理”的对象关联场景设计的轻量级工具。用对了地方,它能让代码更健壮;用错了,反而增加理解成本和调试难度。











