javascript WeakMap是什么_它与Map有什么区别?
发布时间 - 2026-01-05 00:00:00 点击率:次WeakMap 的 key 必须是对象,因为弱引用仅对对象生效;原始值无内存地址,无法被 GC 追踪,用其作 key 会抛 TypeError。
WeakMap 不是 “轻量版 Map”,而是专为避免内存泄漏设计的弱引用键值结构 ——
它不“保管”对象,只“附着”数据。
为什么 WeakMap 的 key 必须是对象?
因为弱引用(WeakReference)在 JavaScript 中只对对象生效:原始值(如 "str"、42、true)没有内存地址,无法被 GC 追踪引用关系。一旦你尝试用原始值作 key,会立刻抛出错误:
const wm = new WeakMap();
wm.set('hello', 'world'); // TypeError: Invalid value used as weak map key
wm.set(123, {}); // 同样报错
- ✅ 允许:
{}、[]、new Date()、document.body、函数等一切继承自Object的值 - ❌ 禁止:
"a"、0、null、undefined、Symbol()(注意:Symbol是原始值,不是对象)
WeakMap 为何不能遍历、没有 size、也不能用数组初始化?
这是弱引用机制的必然代价:GC 可能在任意时刻回收 key,而遍历、size 或构造时的批量读取,都需要“稳定快照”。如果允许这些操作,就等于要求引擎暂停 GC 或维护额外元数据 —— 违背了 WeakMap “零干预 GC”的设计哲学。
- ❌
wm.keys()、wm.values()、wm.entries()、wm.forEach()全部不存在 - ❌
wm.size属性不存在(连访问都会报undefined) - ❌
new WeakMap([['a', 1]])会报错 —— 构造器不接受可迭代参数 - ✅ 唯一安全的 API:只有
wm.set(key, value)、wm.get(key)、wm.has(key)、wm.delete(key)
什么时候该用 WeakMap?典型场景和常见踩坑
核心判断标准:你是否希望“数据随对象一起消失”?如果是,WeakMap 就是唯一选择;否则,用 Map 更稳妥。
- ✅ 推荐场景:
– 给 DOM 元素附加私有状态(如isDragging),页面移除元素后自动清理
– 实现类的私有字段(配合闭包或模块作用域)
– 缓存计算结果,但不想阻止输入对象被回收(例如大型 canvas 图像处理中间结果) - ⚠️ 常见踩坑:
– 把wm.get(obj)的返回值当成“对象还活着”的依据 —— 实际上,只要obj被 GC,wm.get(obj)就返回undefined,且你无法提前感知
– 在异步回调中反复用同一个临时对象作 key:setTimeout(() => wm.get({x:1}), 100),每次都是新对象,查不到旧值,也留不下痕迹
– 误以为 WeakMap 能替代 Symbol 作为私有属性名 —— 它们解决的是不同问题:Symbol 防枚举,WeakMap 防内存泄漏
WeakMap 最难理解的地方不在语法,而在它“不可观测”的特性:你永远无法知道某个 key 是否还在里面,也无法知道它还有多少条目。这种“放手不管”的设计,恰恰是它最强大的地方 —— 也是最容易误用的起点。
# javascript
# java
# 区别
# 作用域
# 为什么
# canva
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何升级到最新版本?(升级指南和步骤)
网页设计与网站制作内容,怎样注册网站?
EditPlus中的正则表达式实战(5)
如何获取免费开源的自助建站系统源码?
Laravel如何使用Collections进行数据处理?(实用方法示例)
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
QQ浏览器网页版登录入口 个人中心在线进入
Laravel怎么实现验证码(Captcha)功能
如何彻底删除建站之星生成的Banner?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何快速搭建高效服务器建站系统?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
长沙做网站要多少钱,长沙国安网络怎么样?
如何在云主机快速搭建网站站点?
如何用VPS主机快速搭建个人网站?
制作旅游网站html,怎样注册旅游网站?
jQuery validate插件功能与用法详解
网站建设整体流程解析,建站其实很容易!
高端建站三要素:定制模板、企业官网与响应式设计优化
桂林网站制作公司有哪些,桂林马拉松怎么报名?
利用JavaScript实现拖拽改变元素大小
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何配置和使用缓存?(Redis代码示例)
JS弹性运动实现方法分析
WordPress 子目录安装中正确处理脚本路径的完整指南
Python函数文档自动校验_规范解析【教程】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何基于云服务器快速搭建个人网站?
高防服务器:AI智能防御DDoS攻击与数据安全保障
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Python结构化数据采集_字段抽取解析【教程】
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel如何自定义错误页面(404, 500)?(代码示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
如何快速生成专业多端适配建站电话?
Python制作简易注册登录系统
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
利用python获取某年中每个月的第一天和最后一天
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?

