详解JavaScript中的WeakMap和WeakSet

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》

​ 

✨ 前言

        内存管理一直是JavaScript这门语言中的难点和痛点。由于其自动垃圾回收机制的限制,在某些场景下很容易出现内存泄漏,影响页面性能。 ES6中新增的WeakMap和WeakSet填补了这方面的短板,提供了一种实现弱引用的方法,可以更精细地控制对象的生命周期。这两个特殊的数据结构为我们处理那些只在某个时间段内需要的对象引用,提供了极大的便利。

        正确使用WeakMap和WeakSet可以优化内存占用,减少内存泄漏的问题。本文将深入解析WeakMap和WeakSet的原理、用法及实际应用场景,帮助读者全面理解这两个强大的数据结构的设计思想和用途,在实际项目中合理使用,编写更健壮的JavaScript程序。

✨ 正文

一、WeakMap和WeakSet介绍

        WeakMap和WeakSet都属于ES6新增的弱引用数据结构。

        WeakMap是一个类似Map的集合,但其中的键名是一个弱引用。 WeakSet是一个类似Set的集合,但其中的值是一个弱引用。

二、WeakMap的特点和用法

  1. WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。这是因为它的键名是一个弱引用,需要一个对象实例来引用。
  2. WeakMap的键名所指向的对象是弱引用关系,如果该对象在其他地方被回收,那么该键名也会自动消失。
  3. WeakMap的键名是不可枚举的。
  4. WeakMap的键值对都是不可遍历的。
  5. WeakMap可以有效防止内存泄露。当WeakMap中某个键名对象不再需要时,会被JS引擎的垃圾回收机制自动回收。

        WeakMap的键名必须是一个对象,不能是其他类型的值。

        WeakMap中的键名是弱引用,如果没有其他的对键名的引用,那么垃圾回收机制会自动回收该键名占用的内存。

WeakMap的API:

  • new WeakMap() 创建WeakMap
  • weakMap.set(key, value) 设置键名和键值
  • weakMap.get(key) 根据键名获取键值
  • weakMap.has(key) 判断是否包含键名
  • weakMap.delete(key) 删除键名和键值

代码示例:

let weakMap = new WeakMap()
let obj = {name: '张三'}weakMap.set(obj, 'hello') weakMap.get(obj) // "hello"obj = null // 自动回收obj
weakMap.get(obj) // undefined

        上面代码中,我们通过WeakMap构造函数创建了一个WeakMap对象weakMap,然后以一个对象obj为键名,设置了一个键值,当obj被置为null时,WeakMap中的该键值对也会被自动回收。 

三、WeakSet的特点和用法

        WeakSet的值必须是一个对象,不能是其他类型的值。

        WeakSet中的值是弱引用,如果没有其他的对值的引用,那么垃圾回收机制会自动回收该值占用的内存。

WeakSet的API:

  • new WeakSet() 创建WeakSet
  • weakSet.add(value) 添加值
  • weakSet.has(value) 判断是否包含某值
  • weakSet.delete(value) 删除某值

代码示例:

const ws = new WeakSet();let obj = {};
ws.add(obj);ws.has(obj); // true// 当obj设置为null后,WeakSet中的值会被垃圾回收  
obj = null;

四、WeakMap和WeakSet的区别

  • WeakMap的键名必须是一个对象,WeakSet的值必须是一个对象
  • WeakMap中的键名是弱引用,WeakSet中的值是弱引用
  • WeakMap有set、get、has、delete方法,WeakSet只有add、has、delete方法
  • WeakMap不可迭代,WeakSet是可迭代的

五、WeakMap和WeakSet的使用场景

  • WeakMap适合临时存放一组键值对,其中键名可以自动回收内存
  • WeakSet适合保存多个对象,而不用担心对象引用问题
  • Vue中的组件缓存使用WeakMap实现
  • React中useEffect的deps使用WeakSet实现

六、WeakMap和WeakSet的兼容性

WeakMap和WeakSet都是ES6引入的,兼容性如下:

  • IE不支持
  • Chrome 36+
  • Firefox 6+
  • Safari 9+
  • Node.js 6+

可以通过polyfill提高兼容性

 

✨ 结语

        WeakMap和WeakSet的出现使JavaScript这门语言的表达能力又上了一个台阶,基于弱引用的设计可以解决一些内存管理方面的痛点。但同时也需要我们注意适用场景,不可滥用,才能发挥其最大效能。

        本文全面介绍了WeakMap和WeakSet这两个新的数据结构在JavaScript中的用法。希望这些知识可以帮助大家在编码中写出性能更优、稳定性更强的应用程序。让我们共同期待JavaScript语言的更大进步!

        

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

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

相关文章

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念,流程,算法,如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代,最大的原因就是不安全,至于为什么不安全,看了下面这张图…

媒体运营常用的ChatGPT通用提示词模板

媒体平台选择:如何选择合适的媒体平台,确保内容的有效传播? 内容策划与创作:如何策划和创作高质量的内容,吸引和留住目标受众? 内容发布与推广:如何有效地发布和推广内容,提高内容…

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践,但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期,比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

Python办公自动化 – 操作NoSQL数据库和自动化图像识别

Python办公自动化 – 操作NoSQL数据库和自动化图像识别 以下是往期的文章目录,需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动…

前端-基础 表格标签 - 相关属性详解

目录 相关属性 : align 属性 : border 属性 : cellpadding 属性 : cellspacing 属性 : width 属性 : height 属性 : 首先,需要声明的是 表格标签这部分属性&…

Hive基础题-1

别看我,不看答案我也不会写 正因为不会写,所以才要每天一练 本地hive练习题 SET hive.exec.mode.local.autotrue; -- 默认 false SET hive.exec.mode.local.auto.inputbytes.max50000000; SET hive.exec.mode.local.auto.input.files.max5; -- 默认 4# …

【2023开发组一等奖】星地一体化智能土壤环境分析监测系统

作品介绍 1 需求分析 土壤是国家最重要的自然资源之一,不仅是构成生态系统的基本要素,同时也是人类赖以生存的物质基础。土壤环境状况不仅直接影响到国民经济发展,而且直接关系到农产品安全和人体健康。2021年底,国务院印发的《“十四五”土壤、地下水和农村生态环境保护规…

云卷云舒:数据库的serverless演进趋势

随着阿里云、华为云的PolarDB、guessDB都在大力演进serverless版本的发布,部分特性已经发布公测,国内的另外两家云服务商移动云、天翼云也相继推出serverless版本,并计划近期公测,可以看出数据库的serverless趋势依然非常明显。 数…

Hotspot源码解析-第十七章-虚拟机万物创建(三)

17.4 Java堆空间内存分配 分配Java堆内存前,我们先通过两图来了解下C堆、Java堆、内核空间、native本地空间的关系。 1、从图17-1来看,Java堆的分配其实就是从Java进程运行时堆中选中一块内存区域来映射 2、从图17-2,可以看中各内存空间的…

Grafana Promtail 配置解析

由于目前项目一般都是部署在k8s上,因此这篇文章中的配置只摘录k8s相关的配置,仅供参考,其他的配置建议上官网查询。 运行时打印配置 -print-config-stderr 通过 ./promtail 直接运行Promtail时能够快速输出配置 -log-config-reverse-order 配…

thinkphp学习07-数据库的数据查询

单数据查询 单条数据查询,一般是一维数组 Db::table()中 table 必须指定完整数据表(包括前缀),如果配置了表前缀,Db::name()中可以忽略 如果希望只查询一条数据,可以使用 find()方法,需指定 wh…

Django 框架添加管理员,完成对普通用户信息管理

前情回顾:Django框架 完成用户登录注册 文章目录 1.创建管理员2.完善管理员功能2.1增加管理员登录功能2.2完善展示用户信息功能2.3完善修改用户信息功能2.4完善删除用户信息功能 1.创建管理员 一般管理员都是直接指定,不开放页面注册,可以直…

Mermaid 教程

Mermaid 教程 Mermaid 介绍 Mermaid 是一个用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它使用类似于 Markdown 的文本语法,使得创建图表变得简单直观。以下是一个简单的 Mermaid 教程,介绍如何使用 Mermaid 创建流程图、时序图和甘特图。…

Qt中QByteArray之元素访问

访问QByteArray类对象中的某个元素主要有4种方式,分别为[]、at()、 data[]和constData[]。其中,[]和data]]方式为可读可写,at()和constData[]方式仅为可读。如果只是进行读操作,则通过at()和constData[]方式的访问速度最快,因为避…

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时,需要查看model的谐振频率,因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示: mpWindow 左侧使用mpWindow,右侧使用什么? wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

【MMC子系统】四、MMC控制器驱动层

我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! …

Keil编译生成的bin文件自动以版本号命名

Keil编译程序生成bin文件时,如何自动以版本号命名bin文件 一、目的二、方法三、实现过程1、脚本形式2、可执行文件形式 一、目的 Keil编译程序时,生成的Hex/Bin文件名字是根据Keil中工程配置里定的名字命名。通常代码里会有一个字段专门用来定义软件版本…

权限维持篇

一、Windows 1、 不死马权限维持 1.1 概述 <?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去 $interval 5; // 每隔*秒运行 do { $filename test.php; if(file_exi…

vue3.2引用unplugin-vue-components插入,解放开发中import组件

目录 前言引用unplugin-vue-components插件的优缺点优点缺点 unplugin-vue-components插件引入安装插件配置vite配置更新TypeScript配置使用代码位置 总结Q&A 前言 unplugin-vue-components是一个用于Vue.js项目的插件&#xff0c;特别适用于Vite和Webpack构建工具。它的主…

Java零基础教学文档第三篇:JDBC

今日新篇章 【JDBC】 【主要内容】 JDBC概述 使用JDBC完成添加操作 使用JDBC完成更新和删除 DBUtils的简单封装 使用JDBC完成查询 使用JDBC完成分页查询 常用接口详解 JDBC批处理 SQL注入问题 事务处理解决转账问题 连接池 使用反射对DBUtils再次的封装 BaseDAO的封…