JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)

简介: JS【详解】Map (含Map 和 Object 的区别,Map 的常用 API,Map与Object 的性能对比,Map 的应用场景和不适合的使用场景)

Map 简介

ES6 新增了数据结构 Map,与普通对象 object 类似,也是键值对的集合,特征如下:

  • 有序(将元素添加的先后顺序作为其次序)【object 无序】
  • 键可以是任意数据类型 【object 的键只能是字符串/Symbol】
  • Map是一个纯哈希结构,而Object不是(它拥有自己的内部逻辑)。
  • 键是唯一性的,不存在重复的键值对。(与 object 相同)
  • 因 Map 也是对象类型,所以它也是 Object 实例
// person_m 是一个Map对象
typeof person_m  // 得到 object
console.log(person_m instanceof Object); //true
 

Map 和 Object 的区别

  • Map 有序,Object 无序
  • Map 的键可以是任意数据类型,Object 的键只能是字符串/Symbol
  • Map是一个纯哈希结构,而Object不是(它拥有自己的内部逻辑)。
  • Map 只能通过构造函数的方式创建,Object 可以通过多种方式(字面量、new Object()、Object.create() 等)创建
  • Map本身具有size属性,Object需要使用 keys()、values()等方法获取;
  • Map本身具有可迭代属性,Object不具有;
  • Map会保持数据的插入顺序,Object不会;

Map 的基本操作

new —— 创建 Map

创建空Map对象

let blank_m = new Map();
 
console.log(blank_m);
// 打印 Map(0) {}

创建含键值对的 Map 对象

let person_m = new Map([
  ["name", "朝阳"],
  ["age", 35],
]);
console.log(person_m);
//  打印 Map(2) { 'name' => '朝阳', 'age' => 35 }

创建以对象为键的 Map 对象

let cp1_boy = {
  name: "朝阳",
};

let cp1_girl = {
  name: "晚霞",
};

let cp2_boy = {
  name: "范闲",
};

let cp2_girl = {
  name: "林婉儿",
};

let cps = new Map([
  [cp1_boy, cp1_girl],
  [cp2_boy, cp2_girl],
]);
console.log(cps);
// 打印
// Map(2) {
//   { name: '朝阳' } => { name: '晚霞' },
//   { name: '范闲' } => { name: '林婉儿' }
// }

get —— 读取键的值

person_m.get("name")

set —— 新增键值对 / 修改键的值

若不存在目标键则新增,若存在,则修改目标键的值

person_m.set("gender", "男");

支持链式调用

person_m.set("age", 40).set("gender", "男");

delete —— 删除键值对

person_m.delete("name");
 

object 删除键的本质是将其键的值设置为 undefined

clear —— 清空键值对

person_m.clear()

has —— 是否存在目标键

返回 true / false

if (person_m.has("name")) {
}

size —— 获取键值对的数量

类似数组的 .length

person_m.size

object 的方法为

Object.keys(target_obj).length
 

Object.getOwnPropertyNames(target_obj).length

遍历 Map

forEach ———— 留意顺序 value, key

person_m.forEach((value, key) => {
  console.log(key, value);
})

for of ———— 留意顺序 key,value (使用了数组解构赋值 [ ] !)

for(let [key,value] of person_m){
  console.log(key,value);
}

Map 转 数组

let arr=[...person_m]
 

得到

[ [ 'name', '朝阳' ], [ 'age', 35 ] ]

其他操作

  • 获取所有键 keys()
for(let key of person_m.keys()){
  console.log(key);
}
  • 获取所有值 values()
for(let value of person_m.values()){
  console.log(value);
}
  • 获取所有键和属性值 entries()
for(let [key,value] of person_m.entries()){
  console.log(key,value);
}

Map 的性能(与 Object 对比)

  • 增加键
    量小时差异不大,量大时,Map比object 快,因为 Map内部使用了哈希表,而object在内存分配和处理上开销较大
  • 查找键
    都非常快,但在某些情况下,当查找的键在数据结构中不存在时,Map可能会比 Object 更快。这是因为Map会在内部快速定位到哈希表中的空位,而0bject需要遍历整个原型链。
  • 删除键
    Map 优于 Object 。因为Map的内部实现使得删除操作更加高效。在Object中,删除一个键实际上仅仅是将其值设置为undefined,而不是真正地从内存中移除,这可能导致内存泄漏和性能下降。
  • 遍历
    Map 优于 Object 。Map内部的哈希表结构保证了遍历的顺序与插入顺序相同。而Object在遍历时,可能因为属性的插入顺序和内部哈希结构而导致遍历顺序不一致。此外,Map提供了内置的迭代器,可以使用for…of循环方便地遍历键值对。

Map 的应用场景

关联复杂数据类型的数据

利用 Map 的键可为任意数据类型的特性!

const employeeProjects = new Map();
employeeProjects.set(employee1, [projectA, projectB]);
employeeProjects.set(employee2, [projectC, projectD]);

// 查找员工参与的项目
console.log(employeeProjects.get(employee1)); // 输出 [projectA, projectB]

Vue3 数据响应式 reactive 和 effect 的源码中,大量使用了 Map

大量键的增删和查找操作

在键的量较大时,Map 对键的增加、删除、查找和遍历性能都比 object 更好。

Map 不适合使用的场景

  • 在需要使用JSON时(因JSON 尚未支持Map,但直接支持Object)
目录
相关文章
|
4月前
|
供应链 搜索推荐 数据挖掘
探秘京东 API 接口的神奇应用场景
京东API如同数字钥匙,助力商家实现商品、库存、订单等多平台高效同步,提升效率超80%。支持物流实时追踪,增强用户满意度;赋能精准营销与数据分析,决策准确率提升20%以上,全面优化电商运营。
157 1
|
5月前
|
人工智能 运维 监控
阿里云 API 聚合实战:破解接口碎片化难题,3 类场景方案让业务响应提速 60%
API聚合破解接口碎片化困局,助力开发者降本增效。通过统一中间层整合微服务、第三方接口与AI模型,实现调用次数减少60%、响应提速70%。阿里云实测:APISIX+函数计算+ARMS监控组合,支撑百万级并发,故障定位效率提升90%。
466 0
|
5月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
5月前
|
移动开发 安全 小程序
淘宝/天猫:使用支付宝API实现多场景支付,覆盖用户偏好
本文详解如何通过支付宝API在淘宝、天猫等平台实现多场景支付,覆盖APP、PC、H5及小程序,结合用户偏好动态配置分期、快捷支付等功能,提升转化率与体验。内容涵盖API核心功能、技术示例(Python)、安全实践与性能优化,确保开发高效可靠。
703 3
监控 安全 API
402 0
|
5月前
|
数据采集 缓存 API
1688 API 实战指南:搞定批发场景的 3 大核心难题(附签名代码与避坑清单)
本文深入解析了1688 API 在批发场景下的三大核心难题及解决方案,涵盖签名机制、商品数据处理与订单同步等高频问题,提供可复用代码与避坑清单,助你高效对接1688平台。
|
6月前
|
供应链 搜索推荐 API
苏宁易购 API 接口:开启苏宁易购全场景零售数据融合新时代
苏宁易购凭借先进的API技术,推动全场景零售数据融合,实现线上线下无缝连接。通过标准化接口,高效整合销售、用户与供应链数据,提升运营效率与消费体验。微服务架构与实时数据处理技术支撑高并发、弹性扩展,赋能开发者共建智慧零售生态。API不仅助力企业降本增效,更为消费者带来智能化、个性化服务,引领零售业迈入数据驱动新时代。
96 0
|
6月前
|
存储 搜索推荐 安全
几个常用的电商API接口及其应用场景
电商平台依赖商品、订单、支付、客户、营销及数据分析六大API,实现商品管理、订单追踪、安全支付、用户个性化服务及精准营销等功能,全面支撑电商高效运营与业务拓展,推动行业智能化发展。
|
7月前
|
缓存 监控 API
电商 API 场景中,电商平台将核心完整诊断、分析和优化过程
某头部电商平台通过分阶段性能优化,将核心 API 的 QPS 从 100 提升至 1000。优化涵盖架构、应用、代码和运维四层,包括引入 API 网关、数据库分库分表、多级缓存、异步化改造、序列化优化、容器化弹性伸缩等关键手段,并结合 Jaeger、Prometheus、wrk 等工具进行性能诊断与监控。最终平均响应时间下降 4.7 倍,错误率降低 15 倍,资源使用率显著下降,系统稳定性与吞吐能力大幅提升。