WeakMap 是键必须为对象且弱引用的映射结构,不阻止垃圾回收,不可迭代、无 size、不能清空,适用于私有数据绑定与避免内存泄漏。
W
eakMap 是 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 中那条记录也随之失效WeakMap 是封闭的“黑盒”,设计上就禁止外部窥探或批量操作:
.keys()、.values()、.entries() 方法,无法用 for...of 或 forEach 遍历.size 属性,无法知道当前存了几项.clear() 方法;如需清空,只能新建一个 new WeakMap()
因为只有同时持有 WeakMap 实例和对应键对象,才能读写其值,所以它常被用于模拟私有字段:
this 上,也无法被 for...in 或 Object.keys() 枚举#private 字段,WeakMap 在跨模块或兼容旧环境时仍有不可替代价值