WeakMap 与 WeakSet

news2024/11/24 19:53:33

WeakSet

WeakSet 结构与 Set 类似,也是不重复的值的集合。

成员都是数组和类似数组的对象,WeakSet 的成员只能是对象,而不能是其他类型的值。

若调用 add() 方法时传入了非数组和类似数组的对象的参数,就会抛出错误


const b = [1, 2, [1, 2]]
new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
  • 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏
  • WeakSet 不可迭代,因此不能被用在 for-of 等循环中。
  • WeakSet 没有 size 属性。

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。


WeakMap

WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。

  • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
  • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
  • 可被垃圾回收,不能遍历,也没有 size 属性,方法有 getsethasdelete

注意

WeakMap 弱引用的只是键名,而不是键值键值依然是正常引用(如下)

const wm = new WeakMap();
let key = {};
let obj = {foo: 1};

wm.set(key, obj);
obj = null;
wm.get(key)
// Object {foo: 1}

上面代码中,键值 obj 是正常引用。所以,即使在 WeakMap 外部消除了obj 的引用,WeakMap 内部的引用依然存在。(注意和下面的对比)


const wm1 = new WeakMap();
let obj1 = {a: 1};
let value1 = 2;
wm1.set(obj1, value1);
wm1.get(obj1);  //  2
obj1 = {};  或者  obj1 = null;
wm1.get(obj1);  //  undefined
wm1;  (结果如下图)

把键名 obj1 赋空值之后,不可以通过 wm1.get(obj1); 获取到正确的键值 value1

但是打印 wm1 发现,之前保存的 键名和键值 依旧存在且正确


弱引用

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

  • 弱引用:垃圾回收机制有一套自己的回收算法,我们都知道一个函数执行完成后该函数在调用栈中创建的执行上下文会被销毁,这里说的销毁,其实指的就是执行上下文中环境变量、词法变量中的数据存储所占据的内存空间被垃圾回收机制所回收,那么垃圾回收机制不考虑 WeakSet 对该对象的引用 是不是就意味着垃圾回收机制不会回收 WeakSet 对象里面的数据所占据的内存呢? 不!不是的!代码是最好的解释
let obj = {name:'kirara'}
let ws = new WeakSet()
ws.add(obj)
obj = null
console.log(ws)  //WeakSet{}

用 ws 中存放一个对象,然后再将该对象置为 null,(一个变量被置为 null,就意味着这个变量的内存可以被回收了)只要 WeakSet 结构中的对象不再需要被引用,那么 WeakSet 就直接为空了,就意味着 WeakSet 中的数据所占据的内存被释放了, Set 结构不会如此(如下)

let obj = {name:'kirara'}
let s  =new Set()
s.add(obj)
obj = null
console.log(s) 
//  value: {name: "kirara"}

WeakSet 使用场景

储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏

<div id="wrap">
    <button id='btn'>确定</button>
</div>

<script>
    let wrap = document.getElementById('wrap')
    let btn = document.getElementById('btn');

    // 假如想给这个btn打上“禁用”标签,选择把它存放在 WeakSet结构中
    const disabledElements = new WeakSet();
		disabledElements.add(btn);
     btn.addEventListener('click', () => {
         wrap.removeChild(btn)
     })
</script>

这里当 button 被移除,disabledElements 中的内容会因为是弱引用而直接变成空

也就是 disabledElements 被垃圾回收掉了其中的内存,避免了一个小小的内存泄漏的产生


文章如有错误,恳请大家提出问题,本人不胜感激 。 不懂的地方可以评论,我都会 一 一 回复

文章对大家有帮助的话,希望大家能动手点赞鼓励,大家未来一起努力 长路漫漫,道阻且长

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

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

相关文章

Linux进程间通信 - 信号(signal) 与 管道(pipe) 与 消息队列

什么是进程间通信&#xff0c;就是进程与进程之间进行通信&#xff0c;互相发送消息&#xff1b;可以通过 信号 或者 管道 或者 消息队列 或者 信号量 去通信&#xff01; 目录 一、信号 1. 信号简介 2. 都有那些信号&#xff1f; 3. 注册信号的函数 1). signal 2). sig…

十一、通过六个因素对织物起球等级进行预测

一、需求分析 根据之前做训练的模型&#xff0c;对不同等级的标准样卡进行测试 测试样本有48张&#xff0c;其中包括起球个数、起球总面积、起球最大面积、起球平均面积、对比度、光学体积六个指标&#xff0c;最终确定出织物的等级 数据集fiber.csv大致结构如下&#xff1a; …

微服务保护 笔记分享【黑马笔记】

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff…

Notion——构建个人知识库

前言 使用Notion快三年了&#xff0c;它All in one的理念在使用以后确实深有体会&#xff0c;一直想找一个契机将这个软件分享给大家&#xff0c;这款笔记软件在网上已经有很多的教程了&#xff0c;所以在这里我主要想分享框架这方面给大家&#xff0c;特别对于学生党、准研究生…

【Java笔试强训 12】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;二进制插…

深圳雷龙SD NAND的存储应用方案

前言: 很感谢深圳雷龙发展有限公司为博主提供的两片SD NAND的存储芯片&#xff0c;在这里博主记录一下自己的使用过程以及部分设计。 深入了解该产品&#xff1a; 拿到这个产品之后&#xff0c;我大致了解了下两款芯片的性能。CSNP4GCR01-AMW是一种基于NAND闪存和SD控制器的4G…

paddle 52 在paddleseg中实现cutmix数据增强方式

CutMix是一种极其有效的数据增强方式,尤其是在遥感影像语义分割中。这主要是因为遥感影像标注成本较大,在实际业务中通常都是采用局部标注的方式进行标注,如下图所示仅对标注成本较小的区域进行标注,而对标注成本较大的地方进行忽略。这使得标签数据中各种类别边界较少(例…

【Python零基础学习入门篇③】——第三节:Python的字符串类型

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学哦&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&…

VS+Qt+C++银行排队叫号系统

程序示例精选 VSQtC银行排队叫号系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQtC银行排队叫号系统>>编写代码&#xff0c;带用户登录&#xff0c;管理员登录&#xff…

Mysql当中Json相关的函数详解

目录 一、前言二、创建JSON文本的函数2.1.JSON_ARRAY&#xff08;转换json数组&#xff09;2.2.JSON_OBJECT&#xff08;转换json对象&#xff09;2.3.JSON_QUOTE&#xff08;转义字符串&#xff09; 三、搜索JSON文本的函数3.1.JSON_CONTAINS&#xff08;json当中是否包含指定…

thinkphp6结合layui增删改查综合案列

文章目录 技术栈实现代码实现数据库 本案例适合新手&#xff0c;特别是杠刚入门thinkphp和layui&#xff0c;但又不是特别熟悉这类 主要实现登录退出功能&#xff0c;用户模块的增删改查功能&#xff0c;分页功能是layui表单自带功能 效果图 左侧的菜单栏我没有写对应的页面&am…

学习记录:2023.4.28

2023.4.28 实习学习记录 Vue1、SVG学习&#xff1a;2、watch监听&#xff1a;3、< g>标签&#xff1a; Vue 1、SVG学习&#xff1a; 百度百科&#xff1a;SVG是可缩放矢量图形&#xff0c;是基于可扩展标记语言(标准通用标记语言的子集)&#xff0c;用于描述二维矢量图…

二、C++、STL标准模板库和泛型编程 ——适配器、补充(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测

时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-LSTM贝叶斯优…

c++标准模板(STL)(std::array)(四)

定义于头文件 <array> template< class T, std::size_t N > struct array;(C11 起) std::array 是封装固定大小数组的容器。 此容器是一个聚合类型&#xff0c;其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数…

MySQL 高可用实战

文章目录 前言实现思路环境准备一、实现MySQL高可用1.1 修改配置文件1.2 MySQL监控脚本1.4 重启keepalived1.5 查看虚拟ip 二、高可用验证2.1 模拟宕机2.2 查看虚拟ip2.3 连接MySQL2.4 恢复主机2.5 查看虚拟ip 总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博…

基于脉搏波的疾病诊断:准确率接近100%的未来前景?

脉搏波分析作为一种无创诊断方法&#xff0c;在糖尿病诊断领域具有巨大潜力。某些研究表明&#xff0c;基于脉搏波的诊断方法在准确性方面可能优于传统血糖检测方法。然而&#xff0c;在将这种方法应用于临床之前&#xff0c;我们需要关注其稳定性、易用性、成本效益等因素。 首…

老胡的周刊(第089期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 MOSS[2] 来自复旦大学的开源工具增强型会话语…

翻译: 迁移学习和微调 Transfer learning fine-tuning

1. 介绍 迁移学习包括获取在一个问题上学到的特征&#xff0c;并将它们用于一个新的类似问题。例如&#xff0c;已经学会识别浣熊的模型的特征可能有助于启动旨在识别狸猫的模型。 迁移学习通常用于您的数据集数据太少而无法从头开始训练全尺寸模型的任务。 在深度学习的背景…

AI模型推理(1)——入门篇

前言 本文主要介绍AI模型推理的相关基础概念&#xff0c;为后续云原生模型推理服务的学习做准备。 初识模型部署 对于深度学习模型来说&#xff0c;模型部署指让训练好的模型在特定环境中运行的过程。相比于常规的软件部署&#xff0c;模型部署会面临更多的难题&#xff1a; …