JavaScript 中 Map 的完整解析

作者:小李子呢0211日期:2026/3/18

Map 是 ES6 新增的键值对集合类型,专门用于解决普通对象({})作为键值存储的痛点(比如键只能是字符串 / 符号、无法直接获取长度等)。

1. 核心特性

特性说明
键的类型可以是任意类型(数字、字符串、布尔值、对象、函数、null/undefined)
遍历顺序严格按照插入顺序遍历(普通对象不保证)
长度获取直接通过 map.size 获取(普通对象需手动计算 Object.keys(obj).length)
键的唯一性同一个键只能存一个值(重复设值会覆盖)
内存 / 性能存储大量键值对时,Map 的增删查效率优于普通对象

2. 基础用法

1. 创建 Map

1// 方式1:创建空 Map
2const map1 = new Map();
3
4// 方式2:初始化带键值对(传入二维数组,每一项是 [键, 值])
5const map2 = new Map([
6  [1, '数字1'],        // 数字键
7  ['name', '张三'],    // 字符串键
8  [true, '布尔值'],    // 布尔键
9  [{id: 1}, '对象键'], // 对象键(普通对象做不到!)
10  [() => {}, '函数键'] // 函数键
11]);
12
13console.log(map2.size); // 输出 5(获取键值对数量)

2. 新增 / 修改键值对(set

set(键, 值):若键已存在则修改值,不存在则新增,返回 Map 本身(可链式调用)。

1const map = new Map();
2map.set('age', 20); // 新增
3map.set('age', 21); // 修改(覆盖原有值)
4map.set('name', '李四').set('gender', '男'); // 链式调用
5
6console.log(map.get('age')); // 输出 21
7console.log(map.get('name')); // 输出 李四

3. 获取值(get

get(键):返回对应值,若键不存在则返回 undefined

1const map = new Map([['name', '张三']]);
2console.log(map.get('name')); // 张三
3console.log(map.get('age'));  // undefined

4. 检查键是否存在(has

has(键):返回布尔值(true/false)。

1const map = new Map([['name', '张三']]);
2console.log(map.has('name')); // true
3console.log(map.has('age'));  // false

5. 删除键值对(delete

delete(键):删除指定键,成功返回 true,失败(键不存在)返回 false

1const map = new Map([['name', '张三'], ['age', 20]]);
2map.delete('age'); // true
3console.log(map.size); // 1
4console.log(map.delete('gender')); // false(键不存在)

6. 清空所有键值对(clear

1const map = new Map([['name', '张三']]);
2map.clear();
3console.log(map.size); // 0

3. 遍历 Map(重点!)

Map 支持多种遍历方式,且遍历顺序永远等于插入顺序

(1)forEach 遍历(最常用)

1const map = new Map([['name', '张三'], ['age', 20]]);
2// forEach(值, 键, 原Map)
3map.forEach((value, key) => {
4  console.log(`键:${key},值:${value}`);
5});
6// 输出:
7// 键:name,值:张三
8// 键:age,值:20

(2)for...of 遍历

1const map = new Map([['name', '张三'], ['age', 20]]);
2
3// 方式1:遍历 [键, 值] 
4for (const [key, value] of map) {
5  console.log(key, value); // name 张三  age 20
6}
7
8// 方式2:只遍历键(map.keys())
9for (const key of map.keys()) {
10  console.log(key); // name  age
11}
12
13// 方式3:只遍历值(map.values())
14for (const value of map.values()) {
15  console.log(value); // 张三  20
16}

4. Map 与普通对象({})的核心区别

对比维度Map普通对象 {}
键的类型任意类型(数字、对象、函数等)仅字符串 / 符号(其他类型会转字符串)
遍历顺序插入顺序ES6 后基本按插入顺序,但不保证(如数字键会优先)
长度获取map.size(直接获取)Object.keys(obj).length(手动计算)
原型污染无(自身无默认键)可能(如 obj.__proto__ 是原型链属性)
性能大量增删查时更优少量键值对时更轻便

JavaScript 中 Map 的完整解析》 是转载文章,点击查看原文


相关推荐


动态规划 线性 DP 经典四题一遍吃透
乌萨奇也要立志学C++2026/3/10

文章目录 台阶问题最大子段和传球游戏乌龟棋 线性dp 是动态规划问题中最基础、最常⻅的⼀类问题。它的特点是状态转移只依赖于前⼀个或前⼏个状态,状态之间的关系是线性的,通常可以⽤⼀维或者⼆维数组来存储状态。 我们在⼊⻔阶段解决的《下楼梯》以及《数字三⻆形》其实都是线性dp,⼀个是⼀维的,另⼀个是⼆ 维的。 台阶问题 题目描述 题目解析 本题就是上一节下楼梯的问题的加强版,总体思路不变,下面我们还是按照动规5板斧来分析一下这道题。 1、状态表示 dp[i]表示走到


一款使用 C# 编写专为 Windows 11 打造的文件资源管理器增强工具!
追逐时光者2026/3/2

前言 在 Windows 11 中,文件资源管理器虽已支持标签页,但默认行为仍会打开多个独立窗口,容易造成桌面混乱。今天大姚给大家分享一款专为 Windows 11 打造的文件资源管理器增强工具:ExplorerTabUtility,它能够自动将新打开的资源管理器窗口转换为标签页,助您实现更简洁、更有条理的文件管理体验。 工具介绍 ExplorerTabUtility 是一款使用 C# 编写专为 Windows 11 文件资源管理器设计的增强型工具,开源免费(MIT license),旨在解决原


AGENTS.md 真的对 AI Coding 有用吗?或许在此之前你没用对?
恋猫de小郭2026/2/22

AGENTS.md 相信大家应该不陌生,它们一般都是被放在根目录的典型 Context Files ,这些文件被默认作为 Coding Agnet 的 「README」,一般是用来提供仓库概览、工具链指令、编码规范或者设计模式等,不少 Agent 还提供 /init 之类命令自动生成这些文件。 实际上在此之前大家都是 GEMINI.md 、CLAUDE.md 、copilot-instructions.md 之类的各自为政,而 2025 之后,OpenAI、谷歌、Cursor 和 Source


【机器学习:逻辑回归】
Keep__Fighting2026/2/13

【逻辑回归】 1、简介 我们知道回归任务一般是处理线性问题的,预测结果是连续的,分类任务是结果是离散的。对于分类问题,在传统的机器学习算法中有很多解决方法,这里讲一下众多思想,其中之一——逻辑回归。 逻辑回归(Logistic Regression)通过将线性回归的输出映射到(0,1)区间,得到一个概率值,通过设定阈值的方式达到分类的效果,在此之中,使用Sigmoid函数将连续值转换为概率值,也即使用Sigmoid映射线性结果到(0,1)之间。 2、激活函数(概率映射) 在逻辑回归中,除了使用s


Slidev:开发者专属的演示文稿神器
修己xj2026/2/5

最近我在逛GitHub时,发现了一个很有意思的项目——Slidev。如果用一句话来总结,那就是: 用 Markdown 写幻灯片,让技术分享更高效、更优雅。 今天就来给大家推荐一下这个项目。 ❓为什么选择 Slidev? 作为开发者,我们经常需要做技术分享、产品演示或会议报告。传统的演示工具(如 PowerPoint、Keynote)虽然功能强大,但对于代码展示和实时编程演示往往力不从心。这就是 Slidev 诞生的原因——专为开发者设计的演示文稿工具。 Slidev(Slide + de


机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold
郝学胜-神的一滴2026/1/26

机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold 引言:为什么特征选择如此重要?一、低方差特征为什么需要移除?1.1 低方差特征的问题1.2 低方差特征的典型场景1.3 数学表达 二、sklearn的VarianceThreshold详解2.1 基本用法2.2 关键参数说明2.3 重要属性 三、实战案例:电商用户行为分析3.1 数据集描述3.2 应用VarianceThreshold3.3 结果分析 四、进阶技巧与注意事项4.1 数据标准


用bhyve-webadmin来管理FreeBSD系统下的bhyve虚拟机(上)
skywalk81632026/1/17

BVCP((Bhyve Virtual-Machine Control Panel ,bhyve-webadmin )是一个图形化和安全的web控制面板,旨在管理FreeBSD bhyve虚拟机。BVCP专为数据中心级可靠性而设计,专为连续24/7运行而构建,专注于稳定性和性能。它是一个本机FreeBSD应用程序,具有简单的一键安装过程,确保快速轻松的部署。BVCP独立于系统配置运行,不修改现有设置,允许它在大多数环境中平稳运行。使用BVCP,管理员可以通过单个统一的界面管理多个物理主机,而不需


计算机视觉入门到实战系列(六)边缘检测sobel算子
_codemonster2026/1/9

边缘检测 一、核心原理:变化的度量二、核心步骤(传统方法)三、经典边缘检测算子sobel算子计算X轴方向梯度计算Y轴方向梯度聚合 一、核心原理:变化的度量 边缘的本质是图像函数(灰度值、颜色值)的突然变化或不连续性。在数学上,这种“变化”可以通过导数或梯度来度量。 一维信号类比:想象一个一维的灰度信号(一条扫描线)。在平坦区域,灰度值恒定,导数为 0。在斜坡(灰度渐变)区域,导数为一个非零常数。在阶跃(灰度突变,即边缘)处,导数会达到一个极值(峰值)。扩展到二维图像:对于二


redis常见问题分析
哈里谢顿2026/1/1

在高并发系统中,缓存(如 Redis)与数据库(如 MySQL)配合使用是提升性能的关键手段。但若设计不当,会引发四类经典问题:双写不一致、缓存穿透、缓存雪崩、缓存击穿。下面逐一详解其原理、危害及解决方案。 一、缓存与 DB 双写不一致(Cache-DB Inconsistency) 🔍 问题描述 当数据更新时,先更新数据库,再操作缓存(删除或更新),但由于网络延迟、程序异常或并发操作,导致 缓存与数据库中的数据短暂或长期不一致。 🧩 典型场景 线程 A 更新 DB → 删除缓存 线程


Python字典元素的增、删、改操作
咖啡の猫2025/12/22

一、前言 字典(dict)是 Python 中最灵活的数据结构之一,支持动态地增加、删除、修改键值对。 然而,看似简单的操作背后,却隐藏着引用共享、内存管理、安全边界等细节。 你是否遇到过这些问题? 修改一个字典,另一个变量也跟着变了?用 d[key] = value 覆盖了重要数据却没察觉?在遍历字典时删除元素,结果报错?想批量更新配置,但代码又长又难维护? 本文将带你: ✅ 掌握字典“增、删、改”的所有核心方法 ✅ 理解 update()、字典解包、| 合并等高级技巧 ✅ 避开引用共

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客