新闻中心
弱引用与垃圾回收_WeakMap和WeakSet的实际用途
WeakMap和WeakSet通过弱引用避免干扰垃圾回收,适用于缓存、私有数据存储和对象标记场景,防止内存泄漏。

很多人知道 WeakMap 和 WeakSet 是 J*aScript 中的弱引用数据结构,但不清楚它们到底有什么用。其实它们的核心价值在于“不干扰垃圾回收”,这在特定场景下非常关键。
什么是弱引用?
普通对象、Map 或 Set 会对其中的键/值保持强引用,只要这些引用存在,对应的对象就无法被垃圾回收。而 WeakMap 和 WeakSet 中的引用是“弱”的,不会阻止垃圾回收器回收其所引用的对象。
这意味着:当你用一个对象作为 WeakMap 的键时,如果这个对象在其他地方不再被引用,它就会被自动清理,WeakMap 不会“拖后腿”。
WeakMap 的实际用途
WeakMap 最常见的用途是关联数据而不影响内存回收。
• 缓存对象相关的计算结果比如你有一个函数,需要为每个 DOM 元素计算某些布局信息。你可以用普通 Map 缓存:
const cache = new Map();function getLayout(el) { if (!cache.has(el)) cache.set(el, computeExpensiveLayout(el)); return cache.get(el);}
问题来了:即使页面移除了某个元素,只要它还在 cache 中,它就不会被回收,造成内存泄漏。换成 WeakMap 就安全了:
const cache = new WeakMap();
当 DOM 元素被删除且无其他引用时,WeakMap 中对应的缓存条目也会自动消失。
• 私有数据模拟在没有私有字段的旧环境中,可以用 WeakMap 存储实例的“私有”状态:
const privateData = new WeakMap();class Person { constructor(name, age) { privateData.set(this, { name, age }); } getName() { return privateData.get(this).name; }}
这样外部无法直接访问 privateData,而且当 Person 实例被销毁时,相关数据也自动释放。
Moshi Chat
法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。
160
查看详情
WeakSet 的实际用途
WeakSet 适合用来标记对象,比如记录哪些对象已经被处理过。
• 标记正在处理中的对象,避免重复操作比如你写了一个渲染函数,可能被频繁调用,但希望对同一个对象只处理一次:
const processing = new WeakSet();function
render(obj) { if (processing.has(obj)) return; processing.add(obj); // 执行渲染逻辑 doRender(obj); // 完成后移除标记(或等其自动回收) // 注意:WeakSet 没有 delete 方法?其实是有的,可以手动 cleaning}
当 obj 被销毁时,WeakSet 中的引用不会阻止回收,也不会造成内存堆积。
• 防止循环引用导致的内存泄漏在观察者模式或事件系统中,WeakSet 可以用来记录已绑定事件的对象,避免重复绑定,同时不影响对象生命周期。
限制与注意事项
WeakMap 和 WeakSet 并非万能,它们有一些重要限制:
• 键必须是对象(WeakMap)或对象类型(WeakSet)不能用字符串、数字等原始类型作为键。
• 不可枚举无法遍历 WeakMap/WeakSet,没有 keys()、values()、entries() 方法,也不能用 for...of。这是为了防止程序依赖其内部状态,干扰 GC 判断。
• 不能保证立即清理垃圾回收是异步的,WeakMap/WeakSet 的清理依赖 GC 时机,不能用于精确控制资源释放。
基本上就这些。WeakMap 和 WeakSet 看似小众,但在需要避免内存泄漏又想附加数据的场景中非常有用。关键是理解:它们让你“用完即走”,不用操心清理。
以上就是弱引用与垃圾回收_WeakMap和WeakSet的实际用途的详细内容,更多请关注其它相关文章!
# 运行机制
# 浏阳营销推广企业
# 厦门美橙互联网站推广员
# 崇左seo公司咨询15火星
# 图书馆网站建设需求
# 当阳网站优化seo推广服务
# 湛江外贸网站推广建设
# 四川淘客推广招聘网站
# 庆安抖音seo
# 东莞网站建设与网络推广
# 民宿的营销推广模式是什么
# 这是
# 返回值
# 垃圾回收
# 高阶
# 移除
# 服务端
# 绑定
# 可以用
# 数据结构
# 递归
# 垃圾回收器
# java
# javascript
# 弱引用
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰
MongoDB聚合管道:正确匹配对象数组中_id的方法
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
J*a应用程序首次运行自动创建文件与目录的最佳实践
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
探索高级语言到原生C/C++的转译:挑战与内存管理策略
Python中高效访问嵌套字典与列表中的键值对
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
Lar*el Excel导入时生成自定义递增ID的策略与实践
生成rdflib自定义SPARQL函数:参数匹配与实践指南
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
快手赚钱渠道_快手收益来源
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
J*aScript设计模式实践_j*ascript代码优化
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
在Socket.IO连接中实现Access Token自动更新与动态重连
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
C++ map遍历方法大全_C++ map迭代器使用总结
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
如何使用纯J*aScript判断Input元素是否在特定类容器内
python3时间如何用calendar输出?
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
Go语言中JSON数据解析与字段访问教程
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
J*a递归快速排序中静态变量的状态管理与陷阱
Django表单验证失败时保留用户输入数据的最佳实践
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
4399免费游戏网址入口 4399小游戏免费入口点开即玩
Go语言中高效处理x-www-form-urlencoded表单数据
Animex动漫社网入口地址 Animex动漫社网正版在线入口
iCloud登录入口网页版 苹果iCloud官网登录
Typer应用中灵活处理命令行参数的令牌化与解析
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
Pandas DataFrame 多条件优先级排序与排名
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
Eclipse怎么运行工程_Eclipse工程运行配置说明
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
PDF文件体积过大处理_PDF压缩技巧详解


2025-12-05
浏览次数:次
返回列表