Map 和 WeakMap:JavaScript 中的键值对集合

JavaScript 是一种动态、弱类型的脚本语言,经常用于构建现代 Web 应用程序。在编写 JavaScript 代码时,我们经常需要使用各种数据结构来存储和管理数据。其中,Map 和 WeakMap 就是两个非常有用的数据结构,它们分别提供了用于存储键值对的容器。在本文中,我们将深入探讨这两个数据结构,了解它们的用途、基本使用方法以及区别。

为什么需要 Map 和 WeakMap

公众号:Code程序人生,个人网站:https://creatorblog.cn

JavaScript 中,对象是一种常见的数据类型,它允许我们将数据组织成键值对的形式。然而,使用对象作为键值对的容器可能会导致一些问题。

例如,当我们使用对象作为键时,键与值之间存在强引用关系,这可能导致内存泄漏问题。此外,对象作为键时,并不能很好地处理键的遍历问题,因为对象的键是字符串或 Symbol 类型。而且对象的键是无法保证顺序的,插入顺序并不等于实际顺序。

MapWeakMap 就是为了解决这些问题而引入的。它们提供了一种更灵活、更安全的方式来管理键值对集合,同时还解决了一些对象作为键所带来的限制。

Map 的基本使用

创建 Map

使用 Map 构造函数可以创建一个新的 Map 对象:

// 创建一个空的 Map
const myMap = new Map();

添加键值对

通过 set 方法可以向 Map 中添加键值对:

myMap.set('key1', 'value1');
myMap.set('key2', 'value2');

获取值

使用 get 方法可以根据键获取对应的值:

const value = myMap.get('key1');
console.log(value); // 输出: value1

遍历 Map

可以使用 forEach 方法和for...of等方式遍历 Map 中的键值对:

myMap.forEach((value, key) => {console.log(`${key}: ${value}`);
});

WeakMap 的基本使用

创建 WeakMap

使用 WeakMap 构造函数可以创建一个新的 WeakMap 对象:

const myWeakMap = new WeakMap();

添加键值对

通过 set 方法可以向 WeakMap 中添加键值对:

const keyObj = {};
myWeakMap.set(keyObj, 'value1');

获取值

使用 get 方法可以根据键获取对应的值:

const value = myWeakMap.get(keyObj);
console.log(value); // 输出: value1

Map 和 WeakMap 的区别

  1. 弱引用Map 中的键是强引用的,而 WeakMap 中的键是弱引用的。这意味着如果在 Map 中使用对象作为键,即使该对象在其他地方被销毁,Map 中仍然保留对该对象的引用,不会被垃圾回收。而在 WeakMap 中,如果键对象被销毁,对应的键值对会自动从 WeakMap 中移除。

  2. 遍历Map 提供了直接的遍历方法,如 forEach。而 WeakMap 没有提供类似的方法,因为键是弱引用的,不稳定。

  3. 性能: 由于 WeakMap 的键是弱引用的,可能导致性能上的一些损失。在大多数情况下,优先选择 Map

总结

MapWeakMapJavaScript 中用于存储键值对的强大工具。选择使用哪一个取决于具体的需求。如果需要使用对象作为键并希望键值对能够被垃圾回收,可以选择使用 WeakMap。如果不需要考虑弱引用和垃圾回收,而且需要直接遍历键值对,那么 Map 是一个更常见的选择。

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

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

相关文章

Excel 文件比较工具 xlCompare 11.01 Crack

比较两个 Excel 文件之间的差异 xlCompare. xlCompare.com 是性能最佳的 Excel diff 工具,用于比较两个 Excel 文件或工作表并在线突出显示差异。xlCompare 包括免费的在线 Excel 和 CSV 文件比较服务以及用于比较和合并 Excel 文件的强大桌面工具。如果您想在线了…

软件测试: 测试用例

一. 软件测试四要素 测试环境,操作步骤,测试数据,预期结果 二. 基于需求进行测试用例的设计 基于需求设计测试用例是测试设计和开发测试用例的基础,第一步就要分析测试需求,验证需求是否正确,完整,无二义性,并且逻辑自洽.在需求正确的基础上细化测试需求,从测试需求提炼出一…

Java语言基础第三天

运算符: 算术:、-、*、/、%、、-- %:取模/取余,余数为0即为整除 System.out.println(5%2); //1,商2余1 System.out.println(8%2); //0,商4余0----整除 System.out.println(2%8); //2,商0余2 /--:自增1/自…

React整理总结(五、Redux)

1.Redux核心概念 纯函数 确定的输入,一定会产生确定的输出;函数在执行过程中,不能产生副作用 store 存储数据 action 更改数据 reducer 连接store和action的纯函数 将传入的state和action结合,生成一个新的state dispatc…

2023年亚太杯数学建模亚太赛A题思路解析+代码+论文

下文包含:2023年亚太杯数学建模亚太赛A题思路解析代码参考论文等及如何准备数学建模竞赛(23号比赛开始后逐步更新) C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料,帮助大家取得好成…

猫12分类:使用yolov5训练检测模型

前言: 在使用yolov5之前,尝试过到百度飞桨平台(小白不建议)、AutoDL平台(这个比较友好,经济实惠)训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…

hdfsClient_java对hdfs进行上传、下载、删除、移动、打印文件信息尚硅谷大海哥

Java可以通过Hadoop提供的HDFS Java API来控制HDFS。通过HDFS Java API,可以实现对HDFS的文件操作,包括文件的创建、读取、写入、删除等操作。 具体来说,Java可以通过HDFS Java API来创建一个HDFS文件系统对象,然后使用该对象来进…

Django DRF权限组件

在Django的drf框架内的权限组件,如果遇到多个权限认证类,是需要所有的权限类都要通过验证,才能访问视图。 一、简单示例 1、per.py 自定义权限类 from rest_framework.permissions import BasePermission import randomclass MyPerssion(B…

傅里叶级数公式及其收敛问题

文章目录 abstract函数展开成傅里叶系数傅里叶系数求解 a 0 a_0 a0​求解 a n a_n an​求解 b n b_n bn​小结 傅里叶级数🎈周期为 2 π 2\pi 2π的函数的fourier级数展开公式小结三角级数收敛问题Dirichlet收敛定理例 abstract 傅里叶级数公式及其收敛问题介绍周期…

自动化运维中间件架构概况

自动化运维中间件架构概况 kubernetesjenkins 安装k8s后 设置 Jenkins 任务: 在 Jenkins 中创建一个新的任务: 配置源代码管理:选择 Git,并提供 GitLab 仓库的 URL、凭据和分支信息。配置构建步骤:选择 Maven 构建,…

集合的自反关系和对称关系

集合的自反关系和对称关系 一:集合的自反关系1:原理:2:代码实现 二:对称关系1:原理:2:代码实现 三:总结 一:集合的自反关系 1:原理: …

【python】直方图正则化详解和示例

直方图正则化(Histogram Normalization)是一种图像增强技术,目的是改变图像的直方图以改善图像的质量。具体来说,它通过将图像的直方图调整为指定的形状,以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…

【Android Jetpack】Hilt的理解与浅析

文章目录 依赖注入DaggerHiltKoin添加依赖项Hilt常用注解的含义HiltAndroidAppAndroidEntryPointInjectModuleInstallInProvidesEntryPoint Hilt组件生命周期和作用域如何使用 Hilt 进行依赖注入 本文只是进行了简单入门,博客仅当做笔记用。 依赖注入 依赖注入是一…

某60区块链安全之不安全的随机数实战二学习记录

区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理 由…

吴恩达《机器学习》9-1:代价函数

一、引入新标记方法 首先,引入一些新的标记方法,以便更好地讨论神经网络的代价函数。考虑神经网络的训练样本,其中每个样本包含输入 x 和输出信号 y。我们用 L 表示神经网络的层数,表示每层的神经元个数(表示输出层神…

CISP练习测试题

免责声明 文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 某公司准备在业务环境中部署一种新的计算机产品,下列哪一项…

基于单片机GPS轨迹定位和里程统计系统

**单片机设计介绍, 基于单片机GPS轨迹定位和里程统计系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 一个基于单片机、GPS和里程计的轨迹定位和里程统计系统可以被设计成能够在移动的交通工具中精确定位车辆的位置…

Spring Boot - 自定义注解来记录访问路径以及访问信息,并将记录存储到MySQL

1、准备阶段 application.properties&#xff1b;yml 可通过yaml<互转>properties spring.datasource.urljdbc:mysql://localhost:3306/study_annotate spring.datasource.usernameroot spring.datasource.password123321 spring.datasource.driver-class-namecom.mysq…

论x巴克app签名的逆向分析过程《完整篇》

app地址—> 点击直达 密码&#xff1a;2fkq工具 jadx-gui 自己下载待定

短视频账号矩阵系统saas管理私信回复管理系统

一、短视频矩阵号系统源码开发层面如何来解决&#xff1f; 1.短视频矩阵号系统源码搭建中&#xff0c;首先开发者需要保证api接口的稳定性 &#xff0c;保证权限应用场景满足官方平台的开发预期。api---待发布、用户管理与授权绑定、私信回复与评论管理等是非常重要的权限接口。…