javascript中的WeakMap是什么_与Map有何不同?

1次阅读

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

javascript中的WeakMap是什么_与Map有何不同?

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免费学习笔记(深入)”;

键是弱引用,不阻碍垃圾回收

这是最根本的区别

javascript中的WeakMap是什么_与Map有何不同?

Veo

Google 最新发布的 AI 视频生成模型

javascript中的WeakMap是什么_与Map有何不同? 567

查看详情 javascript中的WeakMap是什么_与Map有何不同?

  • Map 对键保持强引用:只要 Map 还存在,哪怕外部已无任何变量指向该对象,它也不会被 GC 回收。
  • WeakMap 对键是弱引用:如果一个对象仅被 WeakMap 引用,而其他地方都已释放对该对象的引用,那么 GC 可以随时回收它,WeakMap 中对应的键值对也会自动消失。

这个特性让它天然适合做“附着式元数据”——比如给某个 dom 元素存私有状态,又不想因此拖住元素不被销毁。

没有遍历能力,也没有 size 属性

WeakMap 故意不提供以下功能:

  • 不能用 for...ofkeys()values()entries() 遍历
  • 没有 size 属性,无法知道当前存了几条
  • 没有 clear() 方法(规范已弃用)

这些限制不是疏漏,而是设计使然:避免开发者误以为能“观察”或“控制”这些弱关联的数据,也防止因遍历触发意外的内存驻留。

典型使用场景

WeakMap 的定位很明确:当你需要把一些数据和某个对象绑定,但又不希望这种绑定影响对象的生命周期时,就用它。

  • 为类实例添加真正的私有字段(ES2022 的 # 私有字段出现前的常用模式)
  • 缓存计算结果,键是输入对象,对象销毁后缓存自动失效
  • 存储 DOM 节点的临时状态或配置,页面卸载时无需手动清理

基本上就这些。WeakMap 不是 Map 的“轻量版”,而是一种不同哲学的数据结构:它不管理数据的生命周期,而是让数据随对象自然消亡。

以上就是

text=ZqhQzanResources