JavaScript中Map与Object的区别

在JavaScript中,Map和Object是用于存储键值对数据的两种不同的数据结构(Map是ES6新增的数据结构),它们在构造方式、键的类型以及原型继承等方面存在区别。

一、主要区别

1.构造方式

Map:Map只能通过构造函数new Map()创建。‌

let map=new Map();
map.set('name', 'Tom');
map.set('age', 18);
console.log(map);

Object:可以通过字面量、new Object()Object.create()等方式创建。

let obj={name:'Tom'};
obj.age=18;
console.log(obj);

2.键的类型

Map:Map的键可以是任意类型,包括对象、数组、函数等。

let map1=new Map();
map1.set(1,'number');
map1.set('a','string');
map1.set(true,'boolean');
console.log(map1);

Object:Object的键只能是字符串或者Symbol,其他类型的键会被转换为字符串。

let obj1={};
obj1[1] = 'number';
obj1['a'] = 'string';
obj1[true] = 'boolean'; // 实际存储时会转换成字符串 'true'
console.log(obj1);

3.键的顺序

Map:Map会保持键值对的插入顺序,所以是有序的。

接着上面列子后增加数字key,有序:

map1.set(2,'number');
console.log(map1);

Object:对象是无序的,尽管ES6开始对象保留了字符串和Symbol类型key的创建顺序,但在存在数字key的情况下,会优先迭代数字key。通常按照数值、字符串、Symbol的顺序排列。

接着上面列子后增加数字key,无序(会优先迭代数字key):

obj1[2]='number';
console.log(obj1);

两者对比:

4.键值大小

Map:使用 .size 属性来获取其大小。使用 .get() 方法获取值。

Object: 没有内置的方法来获取其大小(键值对的数量),可采用Object.keys(xxx).length使用 . 获取值。

例如:console.log(map1.size);  // 4    console.log(Object.keys(obj1).length); // 4

console.log(map1.get('a')); // string   console.log(obj1.a);//string

其他访问方式:

Map:提供了一组方法来操作键值对,例如:size返回成员总数,get(key)读取键名对应的键值set(key,value)设置键名对应的键值has(key)查找某个键名是否在map对象中返回布尔值delete(key)删除某个键,clear()清除所有成员无返回值等。

Object:对象通常通过点运算符或方括号运算符来访问属性,使用hasOwnProperty来检查属性是否存在。

5.原型继承

Map:Map不会从原型链中继承属性。

Object:通过字面量创建的对象会继承来自Object.prototype的属性,例如toStringconstructor等。

6.迭代

Map:Map是可迭代的,实现了iterator接口,可以使用for...of或.forEach循环。使用 .keys().values().entries() 获取迭代器。

const map2 = new Map([['a', 1], ['b', 2], ['c', 3]]);
// 遍历 Map
for (let [key, value] of map2) {
console.log(`${key}: ${value}`);
}
// 使用 Map.keys, Map.values, Map.entries
console.log(map2.keys()); // Iterator { 'a', 'b', 'c' }
console.log(map2.values()); // Iterator { 1, 2, 3 }
console.log(map2.entries()); // Iterator { ['a', 1], ['b', 2], ['c', 3] }

Object:对象本身不可直接迭代,但可以先遍历其键或值的集合,在迭代。通过for...in循环,再使用Object.keys()Object.values()、Object.entries等方法获取键、值或键值对

const obj2 = { a: 1, b: 2, c: 3 };
// 遍历 Object
for (let key in obj2) {console.log(`${key}: ${obj2[key]}`);
}
// 使用 Object.keys, Object.values, Object.entries
console.log(Object.keys(obj2)); // ['a', 'b', 'c']
console.log(Object.values(obj2)); // [1, 2, 3]
console.log(Object.entries(obj2)); // [['a', 1], ['b', 2], ['c', 3]]

7.性能

Map:Map提供了有序性和灵活的键类型,在频繁添加和删除键值对的场景下进行了优化,性能表现更好。Map在处理大量数据时性能优于Object,尤其是当键值对数量非常大时。

Object:Object则更适合作为普通对象的容器,尤其在不需要严格顺序和键类型单一的场景中使用。在处理少量数据时,Object的性能优于Map,但在处理大量数据时性能较差。

8.JSON支持

Map:Map JSON不支持Map格式。

Object:对象可以直接被JSON处理,适用于与后端接口交互。

二、使用场景

1.当存储简单数据类型且键为字符串或整数时,优先选择Object,因为它可以通过字面量形式高效创建。

2.当需要在单独的逻辑中访问属性或元素时,应使用Object,例如需要使用this指针的场景。

3.当需要在代码执行时不能确定键的类型时,选择Map更为合适,因为它允许更灵活的键类型。

4.写入删除密集的情况下,由于Map在这方面有性能优势,所以应选择Map。

5.如果需要保持元素的顺序,应选择Map,因为Object无法保证元素的顺序。

6.在处理大量数据时,Map通常比Object更高效,特别是在频繁访问和操作数据的情况下。

7.JSON直接支持Object,但不支持Map,因此在涉及序列化到JSON的应用场景时更适合使用Object。

三、总结

MapObject
构造方式new Map()创建通过字面量、new Object()Object.create()等方式创建
键的类型Map的键可以是任意类型,包括对象、数组、函数等只能是字符串或者Symbol,其他类型的键会被转换为字符串
键的顺序有序无序
键值大小

使用 .size 属性来获取其大小。使用 .get() 方法获取值。

没有内置的方法来获取其大小(键值对的数量)采用Object.keys(xxx).length获取大小。使用 . 获取值。
原型继承不会从原型链中继承属性会从原型链中继承属性
迭代可以直接迭代获取到键值后才能迭代
性能在频繁添加和删除键值对性能更好在频繁添加和删除键值对未作出优化

Map:当需要保持键值对的插入顺序时,或者键是复杂数据类型时(如对象、数组等),使用Map更为合适。例如,在处理复杂数据结构、缓存机制、事件监听器管理等场景中,Map提供了更灵活和高效的方式。

Object:对于简单的键值对存储,或者键是字符串或Symbol时,使用Object更为简单和直接。例如,在处理配置信息、简单的数据映射等场景中,Object更为便捷。

若文章对你有帮助,点赞、收藏加关注吧!

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

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

相关文章

【开源社区openEuler实践】compass-ci

title: 走进 Compass-CI:持续集成与测试的智能领航员 date: ‘2024-12-30’ category: blog tags: Compass-CI持续集成自动化测试软件开发流程 sig: CICD archives: ‘2024-12’ author:way_back summary: Compass-CI 作为一款强大的持续集成与测试平台&#xff0c…

双目视觉:reprojectImageTo3D函数

前言 reprojectImageTo3D 是 OpenCV 中用于从视差图生成三维点云的函数。它的原理是利用视差图和相机的校准参数,通过三角测量法,计算每个像素对应的三维坐标。以下内容根据源码分析所写,觉得可以的话,点赞收藏哈!&am…

pyspark执行group by操作

前情提要 在处理亿级别数据时,常常输入是hive表,因此需要在pypark流程中引入一些场景sql操作,其中group by就是比较常见的操作。 基础步骤 创建SparkSession:通过enableHiveSupport()方法启用Hive支持,确保能够访问…

Megatron - LM; DistBelief; Mesh - Tensorflow

DistBelief、Mesh - Tensorflow、Megatron - LM DistBelief、Mesh - Tensorflow、Megatron - LM 均是在深度学习模型并行训练领域发挥重要作用的框架或技术: DistBelief:是早期支持模型并行的深度神经网络框架之一,采用参数服务器架构实现计算节点之间的输出同步。在深度神…

Spring Boot(快速上手)

Spring Boot 零、环境配置 1. 创建项目 2. 热部署 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency&…

30.Marshal.AllocHGlobal C#例子

Marshal.AllocHGlobal 这个代码为IntPtr分配非托管内存。当访问非托管代码时有时候会需要一个指向非托管内存的指针。因此需要对IntPtr分配非托管内存。分配的大小可以是8个字节。不够可以写更大。 用完要用Free释放内存&#xff0c;否则这个非托管内存不会被C#自动释放。 u…

TTL 传输中过期问题定位

问题&#xff1a; 工作环境中有一个acap的环境&#xff0c;ac的wan口ip是192.168.186.195/24&#xff0c;ac上lan上有vlan205&#xff0c;其ip子接口地址192.168.205.1/24&#xff0c;ac采用非nat模式&#xff0c;而是路由模式&#xff0c;在上级路由器上有192.168.205.0/24指向…

MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别 在MySQL中&#xff0c;我们经常需要对查询结果进行去重&#xff0c;而DISTINCT和GROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用&#xff0c;但它们之间还是存在一些差异的。接下来&#xff0c;我们将通过创建测…

AI 驱动研发模式升级,蓝凌软件探索效率提升之道

深圳市蓝凌软件股份有限公司&#xff08;以下简称蓝凌软件&#xff09;&#xff0c;自2001年成立以来&#xff0c;一直走在数智化办公领域的前沿。作为国家认定的高新技术企业、知识管理国家标准的参编者以及信创供应商10强之一&#xff0c;蓝凌软件始终以“让组织更智慧”为使…

GPU 进阶笔记(四):NVIDIA GH200 芯片、服务器及集群组网

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 传统原厂 GPU 服务器&#xff1a;Intel/AMD x86 CPU NVIDIA GPU2 新一代原厂 GPU 服务器&#xff1a;NVIDIA CPU NVIDIA GPU 2.1 CPU 芯片&#xff1a;Grace (ARM)2.2 GPU 芯片&#xff1a;Hopper/B…

SpringMVC(二)原理

目录 一、配置Maven&#xff08;为了提升速度&#xff09; 二、流程&&原理 SpringMVC中心控制器 完整流程&#xff1a; 一、配置Maven&#xff08;为了提升速度&#xff09; 在SpringMVC&#xff08;一&#xff09;配置-CSDN博客的配置中&#xff0c;导入Maven会非…

jest使用__mocks__设置模拟函数不生效 解决方案

模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…

在K8S中,节点状态notReady如何排查?

在kubernetes集群中&#xff0c;当一个节点&#xff08;Node&#xff09;的状态变为NotReady时&#xff0c;意味着该节点可能无法运行Pod或不能正确相应kubernetes控制平面。排查NotReady节点通常涉及以下步骤&#xff1a; 1. 获取基本信息 使用kubectl命令行工具获取节点状态…

python3中推导式:列表推导式

一. 简介 python中的推导式&#xff0c;是一种简洁创建列表&#xff0c;字典&#xff0c;集合&#xff0c;元组等数据类型的方式。本文简单来学习一下&#xff0c;python中的列表推导式。 Python 支持各种数据结构的推导式&#xff1a;列表(list)推导式&#xff0c;字典(dict…

springboot集成qq邮箱服务

springboot集成qq邮箱服务 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域&#xff0c;如果当前账号未开启的话自己手动开启。 1.3 获取授权码 进入上图中的【管理服务】后&#xff1a;在【安全设置中生成授权码】,也可以直接点击【继续生成…

UE4.27 Android环境下获取手机电量

获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现&#xff0c;会发现编译无法通过。 因为安卓环境下编译时&#xff0c;包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的&#xff0c;但在电…

解释dash中的layout = go.Layout( yaxis={domain: [0, 0.50]}, yaxis2={domain: [0.51

在 Dash 中&#xff0c;layout 是用来配置图表布局的重要对象&#xff0c;其中 go.Layout 是 Plotly 的布局类&#xff0c;用于设置图表的整体外观和属性。 您提供的代码片段是用来设置图表的 Y轴域&#xff08;domain&#xff09;范围 和 多Y轴布局 的。 代码解释 layout g…

Word2Vec解读

Word2Vec: 一种词向量的训练方法 简单地讲&#xff0c;Word2Vec是建模了一个单词预测的任务&#xff0c;通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow&#xff0c;现在假设spiked这个单词被删掉了&#xff0c;现在要预测这个位置原本的单词是…

VBA批量插入图片到PPT,一页一图

Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题&#xff0c;以及解决方案&#xff0c;原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览&#xff1a; …