js 中的map js中的map的使用方法
map比普通对象更适合存储复杂或非字符串键,因为它允许使用任何类型(如对象、函数)作为键,且不会发生类型转换,而对象插入非符号键强制转为字符串导致字符串冲突;map能保持键的插入顺序,提供大小属性和可迭代接口,其次操作大量数据,尤其在间隔增删改查时性能更高效、内存更优;对于需要处理复杂按键类型、大量键值对或要求顺序一致性的场景应优先选择map,而简单配置、静态数据或需要json序列化的场景则仍适合使用object。
Map在JavaScript里是一种新的键值对集合,它你使用任何类型的值作为键,而不仅仅是字符串或符号,并且它可以记住键的插入顺序。
Map是ES6引入的一个强大的功能,它本质上是一个键值对的集合,但与我们熟悉的普通JavaScript对象(Obje)最直观的,Map的键形成可以是任何JavaScript值,包括对象、函数,甚至是null登录后复制或undefined登录后复制。这与Object进行了对比,因为对象的键最终都能被转换成字符串(或者Symbol)。Map提供了一套的API来操作这些键值对:set(key, value)登录后复制用于添加或更新,get(key)登录后复制用于获取,has(key)登录后复制用于检查是否存在,delete(key)登录后复制用于删除,以及size登录后复制登录后复制属性来获取元素的数量。也通常是针对间隙的添加、删除操作做了优化,并且它会按键的插入顺序,这一点在某些场景下是非常重要维护的,因为普通对象的属性顺序在ES6之前是不能保证的(现代JS引擎通常会保留数字键的顺序,其他键则不一定)。Map为什么比普通对象更适合存储复杂还是非字符串键?
这里,我们得聊聊Map在键类型上的“开明”态度。注意看,你平时用对象存储数据,键是不是多半是字符串?比如user.name登录后复制,config.url登录后复制。偶尔用Symbol,那也是为了避免命名冲突。但如果你的按键本身就是一个对象,比如你想用一个DOM元素作为按键来存储它的某种状态,或者用一个函数作为按键来关联它的存储结果,普通对象就束手无策了。它把你的对象按键默默地转换成字符串quot;[object Map则完全没有这个问题,它可以把你的DOM元素、你的函数、你的数组,甚至另一个Map,都作为唯一的键来识别。
const myObjectKey = { id: 1 };const anotherObjectKey = { id: 2 };const myMap = new Map();const myObj = {};myMap.set(myObjectKey, '对象1的值');myMap.set(anotherObjectKey, '对象2的值');console.log(myMap.get(myObjectKey)); // 输出: 对象1的值myObj[myObjectKey] = '对象1的值';myObj[anotherObjectKey] = '对象2的值';console.log(myObj[myObjectKey]); // 输出: 对象2的值(因为myObjectKey和anotherObjectKey都转换为quot;[object Object]quot;)登录后复制
你看,这个差别一下就出来了。而且,Map还提供了size登录后复制登录后复制属性直接获取键值对的数量,而Object手动或者用Object.keys().length登录后复制,晚上在处理大型对象时可能效率不高。面,Map是可迭代的(iterable),你可以直接用for... of 登录后复制 登录后复制循环,或者forEach登录后复制 登录后复制方法,而且它会按照按键的插入顺序来迭代,这对于需要保持数据顺序的场景来说显然就是福音。普通对象的属性迭代顺序在ES6后虽然有所改进(数字键升序,字符串键按创建顺序,符号键按创建顺序),但不像Map那样明显和统一。Map和Object在数据操作效率与内存占用上有哪些实际差异?
说到效率和内存,这块儿其实有点微妙,不是一个大概而论。通常来说,对于大量键值对存储和间隙的增删改查操作,Map在某些场景下会这是因为Map的内部实现通常是基于哈希表或类似的结构,它为按键的查找、插入和删除提供了接近O(1)的平均时间复杂度。而对象的属性查找虽然也很快,但当按键的数量非常庞大,或者按键的类型比较复杂时,其性能可能会受到影响。特别是当你想删除一个属性时,删除obj.key登录后复制可能会导致一些内部优化受阻。
内存占用方面,Map通常被认为比Object更节省内存,尤其是在存储大量键值对时。这主要是因为Map不会像Object那样,为每个键值额外创建一些的属性或方法(比如原型链上的东西)。Map只存储纯粹的键值对。但也不是绝对,具体还是看JavaScript引擎的实现。在某些极端情况下,例如你只存储几个简单的字符串键值对,对象的头部可能反而更小。不过,从设计的角度看,Map是为通用键值存储设计的,而对象则更偏向于格式化数据和原型继承。
一个很实际的例子是,如果你要实现一个存储分区,需要间隔地添加、查找、删除其中,而按键可能不是简单的字符串,Map会是更优的选择。它的API更清晰,性能也更可预测。
如何根据业务需求权衡选择Map或Object?
这其实是个很经典的“选择题”,没有标准答案,得看你的具体需求。按键的类型:如果你的按键是动态的,或者是非字符串/非符号的复杂类型(如DOM元素、对象实例、函数),那么Map是你的不二之选。Object根本无法胜任。按键值对的数量:如果你需要存储大量(比如成百上千甚至更多)的键值对,并且会进行间隔增删改查,地图通常能够提供更好的性能和内存管理。对象在处理超大量数据时,可能会遇到性能瓶颈,尤其是在迭代和删除方面。数据顺序:如果你介意按键的插入顺序,并且需要按照这个顺序来迭代数据,那么Map是唯一可靠的选择。对象的属性顺序虽然在现代JS中有所保证(数字键升序,其他按插入),但不如Map那样明确且在所有情况下都可靠。采用方式:Map提供了forEach登录后复制登录后复制、for...of登录后复制登录后复制(附注()登录后复制登录后复制,keys()登录后复制, value()登录后复制)等多种迭代方式,而且是按插入顺序。Object需要Object.keys()登录后复制,Object.values()登录后复制,Object.entries()登录后复制,再重复数组。Map的迭代然后方式更迭代。快速检查是否存在:Map.has()登录后和Object.prototype.hasOwnProperty.call(obj,key)后复制复制做到了,效率上都简洁。JSON序列化:如果你将数据结构直接序列化为JSON字符串,Object有天然的,因为JSON.stringify()登录后复制可以直接处理普通对象。Map则不行,你需要手动转换成阵列或其他可序列化的结构。链原型和继承:如果你需要利用原型链进行继承,需要或者希望通过原型链来共享方法和属性,那么Object是必须的。Map是一个纯粹的数据集合,不涉及继承。简单配置或静态数据:对于少量、键名固定的配置项,或者作为函数的参数传递,对象通常更简洁方便,比如 const config = { url: '/api', timeout: 5000 };登录后复制。易用性与习惯:对于JavaScript开发者来说,对象的使用历史更久,语法更简洁(obj.key登录后复制 vs
总的来说,地图是为“键值对集合”这个特定目的而生的,它在处理复杂键、大量数据和插入保持顺序方面的表现。而对象则一个出色的多面手,既可以作为键值对集合,也可以作为重构数据容器,还能参与继承继承。选择哪个,就看你的“痛点”在哪里了。如果你的痛点是按键的类型、数据量和顺序,那Map就是你的答案。如果只是简单的配置或者需要JSON序列化,Object依然是好朋友。
以上就是JS中的Map是什么?Map和对象的区别在哪的详细,内容更多请关注乐哥常识网其他相关文章!