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

在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.xdnf.cn/news/1552584.html

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

相关文章

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发,是用于构建 Web 和原生…

XFTP-8下载安装教程

下载地址 https://www.xshell.com/zh/free-for-home-school/ 新建XFTP文件夹 安装过程 选择新建的文件夹 此处默认即可 填写信息提交注册 点击生成的链接 点击后来,完成安装

WebRTC Connection Negotiate解决

最近有个项目 ,部署之后一直显示,查了一些资料还是没有解决,无奈只有自己研究解决? 什么是内网穿透? 我们访问我们自己的官网产品页面,我们的服务器是一个单独的个体,有独立的公网ip&#xf…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难,但随着用户量上升之后,不论是存储还是判断对数据量来说都很麻烦;假如每天有100万用…

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法,第一次使用结点 s s s作为源结点,第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格,给出每次while循环后的 d d d值和 π π π值,以及集合 S S S中的所有结点。如果要写代码&#xff0c…

使用容器启动的zk无法暴露3888问题解决

1. 问题描述 zk配置如下: 我通过容器启动了一个zk,通过-p 参数暴露了2181和3888端口,容器启动脚本如下: #!/bin/shdocker rm -f myzookeeper1docker run -p 12181:2181 -p 13888:3888 --name myzookeeper1 --restart always …

利士策分享,国庆日,共筑梦想,同庆辉煌

利士策分享,国庆日,共筑梦想,同庆辉煌 今天是我们的祖国成立的第75个国庆日,在这个举国同庆的日子里,我感受到了浓厚的节日氛围。 此刻的你,是否也在和家人朋友一起享受这份难得的宁静与快乐呢&#xff1f…

AI产品经理PRD文档与传统产品经理PRD有什么不同呢?

目录 模型输出:说白了,就是你的AI要干啥数据接入:你的AI要吃啥“粮食”验收标准:怎么判断你的AI干得好不好经验总结 你好,我是三桥君 在工作中,当我作为传统产品经理时,通常只需提供产品需求文…

SigmaStudio控件Cross Mixer\Signal Merger算法效果分析

衰减与叠加混音算法验证分析一 CH2:输入源为-20dB正弦波1khz CH1叠加混音:参考混音算法https://blog.csdn.net/weixin_48408892/article/details/129878036?spm1001.2014.3001.5502 Ch0衰减混音:外部多个输入源做混音时,建议参考该算法控件&…

宝塔的软件商店打不开怎么办?

宝塔的软件商店打不开怎么办? 请从下面这个按钮进入: 或者尝试直接打开链接:https://127.0.0.1:1234/soft

自定义注解加 AOP 实现服务接口鉴权以及内部认证

注解 何谓注解? 在Java中,注解(Annotation)是一种特殊的语法,用符号开头,是 Java5 开始引入的新特性,可以看作是一种特殊的注释,主要用于修饰类、方法或者变量,提供某些信…

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…

推送k8s镜像到阿里云服务器

1、服务打包 2、打包后进入Dockerfile的同级目录 运行 docker build -t 镜像名:镜像版本 . (这个点是当前目录的意思,不能忽略)例如 docker build -t trac:v1.0.4 .3、上传镜像到阿里云镜像服务 注意选择区域 例如: docker tag 70743d9bdba3 registr…

jni动态库“%1 不是有效的win32应用程序”问题的解决以及一些windows下dll有关命令的记录

一、前因 在windows下用cmakeVS编译了一个jni动态库,再使用java测试程序调用这个动态库的时候报错:“%1 不是有效的win32应用程序” 对于这类问题,一般从以下几个方面考虑: 动态库文件损坏动态库或者其依赖库文件路径错误导致找…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络,若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

十二、磁盘的调度算法

1.先来先服务(FCFS) 思想 优点 缺点 按访问请求到达的先后顺序进行处理 公平; 如果请求访问的磁道比较集中的话,算法性能还算过的去 如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。 2.最…

STM32新建工程-基于库函数

一、创建一个新工程 我这里选择STM32F103C8的型号,然后点击OK。 keil5里面的小助手,暂时不用,叉掉 二、为工程添加文件和路径 在工程模板中还需要添加启动文件、系统头文件、系统时钟文件,创建一个文件夹start,将下面…

wenyan:markdown 一键转换文章排版

介绍 今天给大家介绍一个markdown排版成自媒体文章的工具。 markdown 的重要性和便捷性不用再多说,但是从markdown 转换到文章排版,我换了很多个也都很不满意,尤其在不支持markdown的平台,更是一言难尽。 本次介绍的wenyan的核心…

C++语言学习(1): std::endl 在做什么?

std::endl 是一个函数(而不是变量): std::endl 会向控制台写入 \n 字符,并且刷新缓冲。 刷新缓冲肯定比不刷新缓冲慢。 这就是为什么有些 guide 里提到,少用 std::endl, 多用 \n.

HarmonyOS NEXT:实现电影列表功能展示界面

时至今日HarmonyOS NEXT早已发布运行了,等其正式推出并大规模商用后,HarmonyOS的历史使命就完成并将退出历史舞台,为用户提供丰富的应用选择。但是Harmony NEXT是在HarmonyOS基础上剔除安卓(AOSP)后的产品,…