日常学习2024.03.12-js中的weakSet

日常学习2024.03.12-js中的weakSet

  • 1.WeakSet是什么?
  • 2.WeakSet 使用弱引用,Set使用强引用

1.WeakSet是什么?

weakSet是什么呢?刚开始自己确实也没什么印象,终结学习一下吧。

WeakSet 是可被垃圾回收的值的集合,包括对象和非全局注册的符号(Symbol基本数据类型)。WeakSet 中的值只能出现一次。它在 WeakSet 的集合中是唯一的。

WeakSet 中的值一定是可被垃圾回收的值。大多数原始数据类型可以被任意地创建,并且没有生命周期,所以它们不能被存储。对象和非全局注册的符号可以被存储,因为它们是可被垃圾回收的值。

它和 Set 对象的主要区别有:

WeakSet 只能是对象和符号的集合,它不能像 Set 那样包含任何类型的任意值。
WeakSet 持弱引用:WeakSet 中对象的引用为弱引用。如果没有其他的对 WeakSet 中对象的引用存在,那么这些对象会被垃圾回收。

第一个区别好理解

const ws = new WeakSet();
ws.add(1) // 报错,Uncaught TypeError: Invalid value used in weak set
ws.add(Symbol()) // 不报错

第二个区别就有点懵了

2.WeakSet 使用弱引用,Set使用强引用

WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

这是因为垃圾回收机制根据对象的可达性(reachability)来判断回收,如果对象还能被访问到,垃圾回收机制就不会释放这块内存。结束使用该值之后,有时会忘记取消引用,导致内存无法释放,进而可能会引发内存泄漏。WeakSet 里面的引用,都不计入垃圾回收机制,所以就不存在这个问题。因此,WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。

由于上面这个特点,WeakSet 的成员是不适合引用的,因为它会随时消失。另外,由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。

举个例子

let weakSet = new WeakSet();// 创建两个对象
let obj1 = { name: 'Object 1' };
let obj2 = { name: 'Object 2' };// 将对象添加到 WeakSet 中
weakSet.add(obj1);
weakSet.add(obj2);console.log(weakSet.has(obj1)); // true
console.log(weakSet.has(obj2)); // true// 移除对 obj1 的引用
obj1 = null;// 在这里,obj1 不再有任何强引用,可以被垃圾回收console.log(weakSet.has(obj1)); // false
console.log(weakSet.has(obj2)); // true```在上述示例中,我们创建了一个 WeakSet 实例 weakSet,并将两个对象 obj1 和 obj2 添加到其中。我们可以使用 has 方法检查对象是否存在于 WeakSet 中。随后,我们将 obj1 的引用设置为 null,从而删除了对它的强引用。此时,obj1 不再有任何强引用,因此它可以被垃圾回收。在最后的两个 console.log 语句中,我们可以看到 weakSet.has(obj1) 返回 false,表示 obj1 已经从 WeakSet 中被移除。而对于 obj2,它仍然存在于 WeakSet 中,因为它仍有一个强引用。

但是如果将WeakSet换成Set呢

let et = new Set();// 创建两个对象
let obj1 = { name: 'Object 1' };
let obj2 = { name: 'Object 2' };// 将对象添加到 WeakSet 中
et.add(obj1);
et.add(obj2);console.log(et.has(obj1)); // true
console.log(et.has(obj2)); // true// 移除对 obj1 的引用
obj1 = null;
console.log(et.has(obj1)); // false
console.log(et.has(obj2)); // true

结果还是一样的!那Set和WeakSet的第二个区别不就没有区别了吗。其实不是的
在上面的代码中,即使我们将 obj 设置为 null,Set 中的对象仍然不会被垃圾回收,因为 Set 本身保持了对它的强引用。如果我们试图检查 set.has(obj),由于 obj 是 null,这个检查没有意义。要正确检查 Set 是否包含对象,我们需要一个有效的引用到那个对象,这在我们的例子中是不存在的。
改一下代码

// 创建一个对象  
let obj1 = { name: "Example1" };  // 创建一个 Set 并将对象添加进去  
let set = new Set();  
set.add(obj1);  // 此时,set 包含了对 obj1 的强引用  // 创建另一个引用,指向同一个对象  
let obj2 = obj1;  // 移除 obj1 引用,但 obj2 仍然引用着对象  
obj1 = null;  // 使用 obj2 检查对象是否仍然在 set 中  
console.log(set.has(obj2)); // 输出 true,因为 obj2 仍然引用着对象,且对象在 set 中  // 现在,如果我们没有其他引用指向对象,并且尝试重新构造一个看似相同的对象,  
// 它将不会被视为同一个对象,因为对象在 JavaScript 中是通过引用比较的  
let obj3 = { name: "Example1" }; // 这是一个新的对象,与之前的 obj1 不是同一个引用  console.log(set.has(obj3)); // 输出 false,因为 obj3 是一个新的对象,尽管它的内容看起来与 set 中的对象相同

这个例子就能说明WeakSet 使用弱引用,这意味着如果没有其他强引用指向对象,对象可以被垃圾回收;而 Set 使用强引用,即使没有其他变量引用对象,Set 也会保持对象不被回收。
好好理解下,如果有问题欢迎指出

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

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

相关文章

安装包逆向1

1.找到程序的入口点 在IDA中我们看到函数非常多,但是一般都是有主要的入口的,所以找一下有没有主函数 可以直接 CtrF直接查找 CNsInstaller::CNsInstaller 这里搞半天在获取文件路径 CNsInstaller::StartInstall CNsInstaller::InstallFunc char…

springboot268码头船只货柜管理系统

码头船只出行和货柜管理系统的设计与实现 摘要 针对于码头船只货柜信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的码头船只货柜管理系统可以从根源上规范整个数据处理流程。 码头船只货柜管理系统能够实现货柜管理…

我和我的DBA之路

这几天,突然想写写这些年的工作总结,毕业至今快20年的回顾。 想到20年前,在做毕业设计的时候,当时是学的机械工程类专业,因为带毕业设计的老师兼职企业有个门户网站的需求,而我又会用DreamWeaver做点网站设…

你的 Python 为什么需要解释一下?

Python 是一种相对简单的编程语言;它主要以解释型语言著称,这意味着每行代码都要通过解释器逐行执行。不过在某些时候,将 Python 代码翻译成计算机可以理解的内容,然后再逐行执行,可以减少繁琐。 在这种情况下&#x…

Spring 面试题及答案整理,最新面试题

Spring框架中的Bean生命周期是什么? Spring框架中的Bean生命周期包含以下关键步骤: 1、实例化Bean: 首先创建Bean的实例。 2、设置属性值: Spring框架通过反射机制注入属性。 3、调用BeanNameAware的setBeanName()&#xff1a…

某电信公司组织结构优化咨询项目成功案例纪实

——构建前后端组织结构,提升组织运营效率 随着企业的不断发展,行业的竞争也越来越激烈,企业只能不断调整自身的战略才能更好的适应这样的大环境。在战略调整的过程中,企业往往会面临这样的问题:管理层的经营理念各不…

哪些订单预计会亏?一张报表告诉你

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 销售订单一般是企业在销售活动中重要的单据,当我们接到一个客户的订单时,就需要在系统中录入一个销售订…

Java中的Map集合如何根据key值排序?

Java中的Map集合如何根据key值排序&#xff08;HashMap<String,Object>&#xff09;&#xff1f; Map集合的键&#xff08;key&#xff09;默认是按照它们的hashCode排序的&#xff0c;这在有时间不符合业务排序。如果你想要根据Map的key值进行排序&#xff0c;一般以下…

python自动爬取,保存并运行程序。

本文使用创作助手。 第一步&#xff08;可跳过&#xff0c;熟悉一下而已&#xff09;&#xff1a; 要在Python中新建一个文本文档并写入内容&#xff0c;可以使用文件操作功能。以下是一个示例代码&#xff1a; # 新建文本文档并写入内容 with open(output.txt, w, encoding…

STM32 | STM32F407ZE中断、按键、灯(续第三天)

上节回顾 STM32 | 库函数与寄存器开发区别及LED等和按键源码(第三天)一、 中断 中断概念 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行(面试题)。 STM32外部中断…

2024年3月11日-3月17日(全面进行)

根据月计划&#xff0c;为了要考虑把产品代码吃透。先对于计算几何&#xff0c;图像处理&#xff0c;测量学基础&#xff0c;slam进行 当然&#xff0c;也要把ue继续进行着。ue的rpg和底层渲染。收集下虚幻商城的免费资源&#xff0c;万一以后做独立游戏用得到。其他的可以暂时…

智慧城市大模型来啦!港大百度推出UrbanGPT

论文作者解读链接&#xff1a;https://blog.csdn.net/qq_42715656/article/details/136681839 项目链接&#xff1a;https://urban-gpt.github.io/ 代码链接&#xff1a;https://github.com/HKUDS/UrbanGPT 论文链接&#xff1a;https://arxiv.org/abs/2403.00813 研究实验室链…

编曲制作软件Fruity Loops Studio 21 中文版及新如何选择适合FL Studio 版本

如果你有着满腔的音乐才华&#xff0c;想要自己在家里发片吗&#xff1f;还是听 MOBY 的电子舞曲不过瘾&#xff0c;要再帮他做做 REMIX&#xff1f;有朋友会说&#xff0c;我不懂乐理&#xff0c;不懂五线谱&#xff0c;怎么制作音乐&#xff1f;这话说得很好&#xff0c;说到…

力扣-[700. 二叉搜索树中的搜索]

递归法 确定递归函数的参数和返回值 递归函数的参数传入的就是根节点和要搜索的数值&#xff0c;返回的就是以这个搜索数值所在的节点。 代码如下&#xff1a; public TreeNode searchBST(TreeNode root, int val) 确定终止条件 如果root为空&#xff0c;返回null&#xff0c…

Apache Paimon系列之:认识Paimon

Apache Paimon系列之&#xff1a;认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构&#xff1a; 如上架构所示&#xff1a; 读/写&#xff1a;Paimon 支持多种读/写数据和…

C++高级面试题:解释 C++ 中的函数对象适配器

解释 C 中的函数对象适配器 函数对象适配器是 C 中的一种编程技术&#xff0c;用于修改或增强现有的函数对象的行为。它们通常通过组合或包装现有的函数对象来实现所需的功能。 函数对象适配器允许我们在不修改原始函数对象的情况下&#xff0c;对其进行修改或扩展。这样可以…

4、设计模式之建造者模式(Builder)

一、什么是建造者模式 建造者模式是一种创建型设计模式&#xff0c;也叫生成器模式。 定义&#xff1a;封装一个复杂对象构造过程&#xff0c;并允许按步骤构造。 解释&#xff1a;就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单对象组合起来…

使用 ReclaiMe Pro 进行 RAIDZ 数据恢复

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ZFS 是一个开源文件系统&#xff0c;主要用于 FreeNAS 和 NAS4Free 存储系统。在开发 ZFS 时&#xff0c;主要目标是可靠性&#xff0c;这是通过写时复制、冗余元数据、日志等不同功能来实现的。ZFS 使用自…

修改表结构

目录 修改表结构 创建数据表插入数据 修改已有列 修改 member 表的 name 列的定义 为表增加列 增加一个 address 列&#xff0c;这个列上不设置默认值 增加一个 sex 列&#xff0c;这个列上设置默认值 删除表中的列 删除 sex 列 Oracle从入门到总裁:​​​​​​https…

Kibana中的KQL语法

Kibana中的KQL语法 注意 KQL匹配时是不区分大小写的&#xff0c;可以使用括号改变匹配优先级&#xff1b;另外一个要点就是&#xff0c;匹配是包含&#xff0c;某个字段包含某个词&#xff0c;而不是某个字段的值等于某个词。 等值匹配&#xff08;equals&#xff09; 分词…