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 的“轻量版”,而是一种不同哲学的数据结构:它不管理数据的生命周期,而是让数据随对象自然消亡。
以上就是javascript中的WeakMap是什么_与Map有何不同?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543294.html
微信扫一扫
支付宝扫一扫