javascript弱引用

1.使用场景

弱引用(WeakRef)在以下情况下可以很有用:

  1. 缓存:当你需要缓存对象,但又不想因为缓存的存在而阻止对象被垃圾回收时,可以使用弱引用。通过将对象存储在弱引用中,即使没有其他对该对象的强引用,垃圾回收器仍然可以自动回收对象。

  2. 监控对象的生命周期:如果你需要在对象被垃圾回收时执行一些特定的操作或清理工作,可以使用弱引用来监控对象的生命周期。通过使用WeakRefFinalizationRegistry,你可以注册一个回调函数,在对象被回收时执行相应的操作。

  3. 避免循环引用:在某些情况下,对象之间可能存在循环引用,即相互引用导致无法被垃圾回收。通过使用弱引用,你可以将其中一个对象作为弱引用存储,从而避免循环引用并允许相关对象在不再被引用时被回收。

需要注意的是,弱引用的使用需要谨慎,因为被弱引用的对象可以在任何时候被垃圾回收。因此,在使用弱引用时,你需要考虑对象的生命周期和访问时的有效性,以避免出现意外的错误。

弱引用主要应用于一些特定的场景,而在大多数情况下,通常使用普通的引用(即强引用)就足够了。使用弱引用时需要权衡其优势和限制,并确保在适当的情况下使用它们。

2.业务场景例子

以下是几个业务示例,说明了在这些场景中使用弱引用的好处:

  1. 图片缓存:

    在一个图片缓存系统中,你可以使用弱引用来存储已加载的图片对象。当图片不再被页面或其他对象所引用时,垃圾回收器可以自动回收这些图片对象。这样可以避免缓存过多的图片占用过多的内存,并在需要时重新加载图片。

  2. 页面导航栈:

    在一个浏览器或移动应用程序中,你可以使用弱引用来存储页面导航栈中的页面对象。当用户导航到其他页面时,垃圾回收器可以自动回收不再被访问的页面对象。这样可以避免导航栈过多的页面对象占用过多的内存。

  3. 缓存管理器:

    在一个缓存管理器中,你可以使用弱引用来存储已缓存的数据对象。当数据不再被其他对象引用时,垃圾回收器可以自动回收这些数据对象。这样可以避免缓存过多的数据占用过多的内存,并在需要时重新加载数据。

  4. 计时器和回调管理:

    在一个计时器和回调管理系统中,你可以使用弱引用来存储计时器对象或回调函数对象。当计时器或回调函数不再被其他对象引用时,垃圾回收器可以自动回收这些对象。这样可以避免过多的计时器或回调函数对象占用过多的内存,并在需要时释放资源。

需要注意的是,以上示例仅说明了在特定的业务场景中使用弱引用的可能性和好处。具体实现时,你需要根据业务需求和实际情况来决定是否使用弱引用,并确保在使用弱引用时考虑到其优势和限制。

3.WeakRef 和 FinalizationRegistry的使用

WeakRefFinalizationRegistry是ECMAScript 2021引入的新API,用于处理弱引用和垃圾回收。下面是关于它们的使用示例和说明:

  1. WeakRef

    WeakRef允许你创建一个对对象的弱引用。弱引用意味着如果没有其他强引用指向该对象,垃圾回收器可以自动回收该对象。

    示例:

    let obj = { data: 'example' };
    let weakRef = new WeakRef(obj);// 通过弱引用获取对象
    let target = weakRef.deref();
    console.log(target); // { data: 'example' }obj = null; // 移除对原始对象的强引用// 在垃圾回收之后,弱引用将返回 undefined
    target = weakRef.deref();
    console.log(target); // undefined
    

    在上面的示例中,我们首先创建了一个对象obj,然后使用WeakRef创建了一个对obj的弱引用weakRef。通过deref()方法,我们可以通过弱引用获取原始对象。当我们移除对原始对象的强引用后,垃圾回收器会自动回收对象,此时通过弱引用获取的结果将为undefined

  2. FinalizationRegistry

    FinalizationRegistry允许你注册在对象被垃圾回收时执行的回调函数。

    示例:

    let obj = { data: 'example' };
    let finalizationRegistry = new FinalizationRegistry((heldValue) => {console.log('Object has been garbage collected:', heldValue);
    });finalizationRegistry.register(obj, 'some value');obj = null; // 移除对原始对象的强引用// 在垃圾回收之后,注册的回调函数将被执行
    

    在上面的示例中,我们创建了一个对象obj和一个FinalizationRegistry实例finalizationRegistry。然后,我们使用register()方法将对象obj和一个额外的值注册到finalizationRegistry中。当我们移除对原始对象的强引用后,垃圾回收器会自动回收对象,并执行注册的回调函数。

请注意,WeakRefFinalizationRegistry的使用可能因不同的JavaScript运行时环境而有所不同。具体的细节和更多的用法示例可以通过查阅相关的官方文档来获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线段树基础(上)

普通线段树 线段树原理 (证明) 线段树是一种维护序列操作的二叉树数据结构。 线段树存在以下五个操作: build:创建一颗线段树push_up:根据子节点计算父节点的信息push_down:根据父节点的修改标记去更新…

深度学习框架Pytorch学习笔记

由于工作原因,需要使用到深度学习pytorch框架,所以,跟随视频学习了深度学习框架的使用方法 1、安装pytorch 在windows下使用pytorch,首先找到anaconda官网,安装64位windows版本,然后使用清华的源替换掉an…

基于SSM的学生信息管理系统

基于SSM的学生信息管理系统资源-CSDN文库 项目介绍 学生管理系统是我从自己学校的综合信息平台得到灵感,于是使用学习过的Spring、SpringMVC、Mybatis框架LayUI完成了这么一套系统。 项目整体难度不大,部署简单,界面友好,代码结…

C语言易错知识点十(指针(the final))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载,请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤ 许久不见,甚是想念,真的是时间时间,你慢些吧,不能再让头发变秃…

面试官:为什么不推荐使用 uuid 作为 mysql 主键?

我个人始终觉得,大多数技术是没有优劣之分的,在适合的地方使用,它就是最好的! 面试官:为什么不推荐使用 uuid 作为 mysql 主键? 如果你面试遇到这个问题(面试官并没有给出对应的场景,那么这家…

阿里员工:本月收入489325元,开心过年

阿里员工:本月收入489325元,开心过年 近日,一名阿里员工在社交媒体上爆料自己的本月收入,竟然高达48.9万,真是让人目瞪口呆。 震惊之余,大家都很好奇这么高收入是怎么来的,再仔细看工资单&…

C语言-破解密码

题目描述 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设老王原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换…

vue3 ts面试题 常问面试题(连更中.......有错 欢迎提出)

Vue2 和 vue3 区别 Api? 升级v3是因为 v2有一些基础bug 例如数据丢失等 但是 v3就解决了这个问题 v3利用了双向数据绑定 数值变化页面就该变 v2 和 v3 的 api 不一样 v2的api是选择式的 v3是组合式的 例如 setup就是组合的 v2 和 v3 的生命周期也不太一样 v2 和 v3 …

力扣LeetCode第80题 删除有序数组中的重复项 II

一、题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示…

excel数据使用xlsx读取转换成JSON

一般读取excel的工作都由后端完成,比如java使用poi插件。如果存在少量非敏感数据,比如日志、模板数据,可以直接由前端搞定。 使用xlsx插件 在线json格式化、excel转json测试 一、安装 可以安装以下版本,不会出现问题 yarn ad…

Mysql 中子查询时order by与group by合用无效的解决办法

存在一个需求: 需要获取某些条件下,在分组后,取最新的记录。 比如有张学生分数表,里面包含了学生一年的所有考试的语数外成绩,我想要获取同学A的最后一次考试成绩。 select * from ( select * from student_score wh…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目,都用到了蓝牙模块,如:手机和stm32的通信,电赛中的双车通信,还是遥感小车的…

R语言【stats】——处理R对象中的缺省值:na.fail(), na.omit(), na.exclude(), na.pass()

Package stats version 4.3.2 Parameters na.fail(object, ...)na.omit(object, ...)na.exclude(object, ...)na.pass(object, ...) 参数【object】:R 对象,通常是一个数据帧。 参数【...】:特殊方法可能需要的其他参数。 目前&#xff0…

X-AnyLabeling 图像标注工具及模型自动标注;json2yolo格式转换、yolo训练数据集划分

一、X-AnyLabeling 图像标注工具及模型自动标注 参考:https://github.com/CVHub520/X-AnyLabeling 1、下载 直接https://github.com/CVHub520/X-AnyLabeling/releases/tag/下载对应版本 软件打开: 2、自定义标注模型yaml构建 这里自定义模型自动标注加载预训练的yolov8…

LeetCode994腐烂的橘子(相关话题:矩阵dfs和bfs)

题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

【C#与Redis】--实践案例--案例 3:使用 Redis 实现排行榜

实现一个基本的排行榜系统通常涉及到对分数进行排序,而 Redis 的 Sorted Set 数据结构非常适合这种用途。以下是一个使用 StackExchange.Redis 库在 C# 中实现排行榜的简单案例: 安装 StackExchange.Redis 库: Install-Package StackExchan…

Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人

游戏场景——敌人——移动的敌人 制作预制体 将坦克拖拽至场景中进行设置 写代码 让坦克在两点之间不停移动 随机坐标函数 然后在start()中调用即可 坦克要一直盯着玩家 当小于一定距离时,攻击玩家 重写开火逻辑 注意还要将其tag改成Monster! 当敌人死…

虚拟化分类和实现原理

6、虚拟化分类 (1)完全虚拟化 直接将Hypervisor跑在0环内核态,客户机os跑在1环,一旦触发敏感指令,由0环的VMM进行捕获翻译,从而模 拟这些指令。而运行在1环的GuestOS永远都不知道自己是个虚拟机。是完全…

【Transformer】深入理解Transformer模型2——深入认识理解(上)

前言 Transformer模型出自论文:《Attention is All You Need》 2017年 近年来,在自然语言处理领域和图像处理领域,Transformer模型都受到了极为广泛的关注,很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

OpenCV实战 -- 维生素药片的检测记数

文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片:2. 形态学处理:3. 二值化:4. 提取轮廓:5. 轮廓筛选和计数: 分水岭算法:逐行解释在基于距离变换的分水岭算法中&…