JavaScript Map全解:从基础到高级应用

news2024/10/2 6:26:28

在JavaScript中,Map是一种内置的数据结构,用于存储键值对。与普通的对象(Object)相比,Map提供了更多的灵活性和功能。本文将全面介绍Map的基础用法、特性、高级应用以及与普通对象的区别,帮助你更好地理解和使用Map

一、基础用法

1. 创建Map

你可以使用new Map()构造函数来创建一个空的Map对象,或者使用包含键值对数组的Map构造函数来初始化Map

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

// 创建一个已初始化的Map
const myInitializedMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2'],
  ['key3', 'value3']
]);

2. 添加键值对

使用set方法可以向Map中添加键值对。

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

3. 获取值

使用get方法可以通过键来获取对应的值。

const value1 = myMap.get('key1'); // 'value1'

4. 检查键是否存在

使用has方法可以检查Map中是否存在某个键。

myMap.has('key1'); // true
myMap.has('key4'); // false

5. 删除键值对

使用delete方法可以删除指定的键值对。

myMap.delete('key2');

6. 获取Map的大小

使用size属性可以获取Map中键值对的数量。

myMap.size; // 返回Map中键值对的数量

7. 清空Map

使用clear方法可以清空Map中的所有键值对。

myMap.clear();

二、特性

1. 键的类型多样性

Map中,键可以是任何类型,包括对象、函数、甚至是undefinedNaN。而在普通对象中,键只能是字符串或符号。

const objKey = {};
myMap.set(objKey, 'value with object key');

2. 保持插入顺序

Map按照键值对的插入顺序进行迭代,而普通对象的属性顺序在不同的JavaScript引擎中可能会有差异。

for (let [key, value] of myMap) {
  console.log(`${key}: ${value}`);
}

3. 性能优势

在大多数情况下,Map的查找和删除操作比对象更快,特别是当键不是字符串时。Map内部使用哈希表实现,提供了高效的键值对存储和检索机制。

三、高级应用

1. 遍历Map

Map提供了多种遍历方式,包括keys()values()entries()方法和forEach方法。

// 遍历所有的键
for (const key of myMap.keys()) {
  console.log(key);
}

// 遍历所有的值
for (const value of myMap.values()) {
  console.log(value);
}

// 遍历所有的键值对
for (const [key, value] of myMap.entries()) {
  console.log(`${key}: ${value}`);
}

// 使用forEach方法遍历
myMap.forEach((value, key) => {
  console.log(`${key}: ${value}`);
});

2. 合并Map

你可以通过遍历一个Map并将其键值对添加到另一个Map中来合并两个Map

const map1 = new Map([['key1', 'value1'], ['key2', 'value2']]);
const map2 = new Map([['key3', 'value3'], ['key4', 'value4']]);

const mergedMap = new Map(map1);
for (let [key, value] of map2) {
  mergedMap.set(key, value);
}

3. 克隆Map

你可以使用扩展运算符(...)来克隆一个Map

const clonedMap = new Map([...myMap]);

4. 使用Map进行缓存

在前端开发中,Map常用于缓存数据,以避免重复的计算或网络请求。

const cache = new Map();

function fetchData(key) {
  if (cache.has(key)) {
    return Promise.resolve(cache.get(key));
  }
  const promise = fetch(`/api/data?key=${key}`).then(res => res.json());
  cache.set(key, promise);
  return promise;
}

四、Map与普通对象的区别

  1. 键的类型Map的键可以是任何类型,而普通对象的键只能是字符串或符号。
  2. 有序性Map保持键值对的插入顺序,而普通对象的属性顺序在不同的JavaScript引擎中可能会有差异。
  3. 原型链Map的原型上没有默认的方法或属性,不会像普通对象那样继承原型链上的属性。
  4. 性能:在大多数情况下,Map的查找和删除操作比对象更快,特别是当键不是字符串时。

五、总结

Map是JavaScript中一种非常强大的数据结构,提供了灵活的键值对存储和检索机制。通过掌握Map的基础用法、特性和高级应用,你可以在开发过程中更加高效地处理键值对数据。无论是存储复杂的数据结构,还是进行数据的缓存和合并,Map都能提供简洁而高效的解决方案。

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

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

相关文章

SemiDesgin中后台组件库,字节跳动出品,能否火,有待检验。

2021年字节跳动SemiDesgin中后台组件库发布。 SemiDesgin官方解释:SemiDesgin由是字节跳动抖音前端与UED团队设计、开发并维护,包含设计语言、React 组件、主题等开箱即用的中后台解决方案,帮助设计师与开发者打造高质量产品。 SemiDesgin&a…

Python画笔案例-072 绘制弹跳扇子

1、绘制弹跳扇子 通过 python 的turtle 库绘制 弹跳扇子,如下图: 2、实现代码 绘制弹跳扇子,以下为实现代码: """弹跳扇子.py """ import time import turtleturtle.speed(0) turtle.left(

【Windows】如何取消显示Windows聚焦在桌面上生成的“了解此图片”图标

如下图所示,在更换Windows聚焦显示的时候,会在桌面多出一个“了解此图片”的图标,看着很烦,但又因为Windows聚焦自带的壁纸比其他主题的壁纸好看很多。 下面是消除办法: 打开注册表(按WindowsR&#xff0…

网络编程套接字TCP

前集回顾 上一篇博客中我们写了一个UDP的echo server,是一个回显服务器:请求是啥,响应就是啥 一个正常的服务器,要做三个事情: 读取请求并解析根据请求,计算响应把响应写回到客户端 DatagramPacket res…

车辆重识别(2021NIPS在图像合成方面,扩散模型打败了gans网络)论文阅读2024/10/01

本文在架构方面的创新: ①增加注意头数量: 使用32⇥32、16⇥16和8⇥8分辨率的注意力,而不是只使用16⇥16 ②使用BigGAN残差块 使用Big GAN残差块对激活进行上采样和下采样 ③自适应组归一化层 将经过组归一化操作后的时间步和类嵌入到每…

十三、减少磁盘延迟时间的方法

1.交替编号 让逻辑上相邻的扇区在物理上不相邻; 原因:由于磁头在读取完一个扇区之后需要等待一段时间才能再次读入下一个扇区,如果逻辑上相邻的扇区在物理上相邻的话,需要等待磁盘转完一圈才能读取到。 2.错位命名 让相邻盘面上…

观测云对接 SkyWalking 最佳实践

简介 SkyWalking 是一个开源的 APM(应用性能监控)和可观测性分析平台,专为微服务、云原生架构和基于容器的架构设计。它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化的解决方案。如果您的应用中正在使用SkyWalking &#xf…

opencv实战项目二十八:基于Shi-Tomasi算法的箱子角点检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、角点检测方法概述二、Shi-Tomasi角点检测法 前言 随着科技的飞速发展,计算机视觉技术在我们的日常生活中扮演着越来越重要的角色。从无人驾驶汽…

Oracle exadata存储节点更换内存操作及报错处理

1.报错信息 在进行Oracle exadata巡检时,发现cell节点有一根内存报错,报错信息如下: 报错内存位置为:CPU1 P1/D2槽位 报错内存信息: 根据报错信息确认内存PN号、大小等息,并将信息反馈公司,及…

git初级使用学习(图文)

以后工作少不了使用git,记录一下今天的学习,防止忘记 Git 是一个分布式版本控制系统,常用于代码管理和团队协作 首先新建一个文件夹,作为本地仓库 mkdir git-practice 初始化仓库 git init 新建个test1.cpp文件,…

CSS中字体图标的使用

引言: 在网页设计当中,会有很多很简洁的图标,比如箭头,照相机,放大镜等 这些大概率都是使用字体图标来完成的,因为字体图标比较简洁高效,不会像图片一样需要向浏览器请求数据。那么字体图标该…

第七篇:重定向和管道相关知识总结

续第六篇:Linux进程的相关知识总结(2)-CSDN博客 目录 第五章:管道和重定向 5.1重定向 5.1.1产生重定向的原因 5.1.2重定向的应用 5.1.3查看现有的进程号、文件描述符 5.1.3.1文件描述符(FD、文件句柄&#xff0…

Redis介绍及整合Spring

目录 Redis介绍 Spring与Redis集成 Redis介绍 Redis是内存数据库,Key-value型NOSQL数据库,项目上经常将一些不经常变化并且反复查询的数据放入Redis缓存,由于数据放在内存中,所以查询、维护的速度远远快于硬盘方式操作数据&#…

Vortex GPGPU的github流程跑通与功能模块波形探索

文章目录 前言一、跟着官方文档走一遍二、cache子模块的波形仿真2.1 必要的文件内容解释2.2 cache子模块波形仿真——目前环境没啥问题了,就vcd因为配置问题出不来 总结 前言 看了那么久的verilog代码和文档,但还是没怎么接触过Vortex GPGPU全流程跑通与…

Vscode、小皮面板安装

Vscode下载官网:Visual Studio Code - Code Editing. Redefined 小皮面板官网:小皮面板-好用、安全、稳定的Linux服务器面板! (xp.cn) 一、进入vscode官网下载 后面就是一通无脑下一步下一步 安装好后的界面如下图 二、下载小皮&#xff0…

面试题1-fail-safe机制与fail-fast 机制

1.定义 Fail-safe 和 Fail-fast,是多线程并发操作集合时的一种失败处理机制。 1.1.Fail-Safe机制 1.1.1.定义 Fail-Safe 机制的设计目标是在发生故障时,系统仍然能够继续运行,尽量避免导致整个系统崩溃。即使发生错误或异常,系统…

记录|Modbus-TCP产品使用记录【摩通传动】

目录 前言一、摩通传动实验图1.1 配置软件 IO_Studio1.2 测试软件Modbus Poll1.2.1 读写设置测试1.2.2 AI信号的读取 1.3 对应的C#连接Modbus的测试代码如下【自制,仅供参考】1.4 最终实验图 更新时间 前言 参考文章: 自己需要了解和对比某些产品的Modbu…

GAN|对抗| 生成器更新|判别器更新过程

如上图所示,生成对抗网络存在上述内容: 真实数据集;生成器;生成器损失函数;判别器;判别器损失函数;生成器、判别器更新(生成器和判别器就是小偷和警察的关系,他们共用的…

【STM32单片机_(HAL库)】4-4【定时器TIM】脉冲计数配置步骤及实验

脉冲计数配置步骤 1.硬件 STM32单片机最小系统按键模块 2.软件 定时器HAL驱动层文件添加counter驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "…

热销的五款骨传导耳机真的好用吗?无广测评五款骨传导耳机

在科技快速发展的背景下,产品设计的重点开始转向考虑人们的行为方式与健康需求。耳机,已成为现代生活中不可或缺的一部分,无论是出于日常习惯、隐私考量,还是在公共场合的礼貌需求,耳机都始终陪伴着我们。 随着耳机在…