Map 是 JavaScript 中比 Object 更可靠灵活的键值映射结构,支持任意类型键、严格相等比较、原生迭代、顺序保证及高效增删操作。

Map 是 JavaScript 中专门用于键值映射的数据结构,它比普通对象(Object)更可靠、更灵活,尤其适合需要精确键类型控制、动态键或大量增删操作的场景。
Map 能用任意类型作键,Object 只能用字符串或 Symbol
普通对象会把所有键自动转成字符串,导致数字、布尔值、对象等作为键时出现意外行为:
-
{ true: 'a', 1: 'b' }实际等价于{ 'true': 'a', '1': 'b' },因为true和1都被转成了字符串 -
{ [1]: 'x', [2]: 'y' }会变成{ '1,2': 'x', '3,4': 'y' }(数组被toString()转换)
而 Map 保留原始类型:
-
map.set({}, 'obj1'); map.set([], 'arr1');—— 两个不同引用的空对象/数组可同时作为独立键存在 -
map.set(0, 'zero'); map.set(false, 'false');——0和false是不同键,不会互相覆盖
Map 的键是严格相等(===),Object 的属性名是字符串强制转换
Object 的属性访问和遍历都基于字符串键,无法区分 1 和 '1';Map 使用 SameValueZero 算法(类似 ===,但 NaN === NaN 为 true),语义更清晰、更可控。
立即学习“Java免费学习笔记(深入)”;
-
const obj = { 1: 'num', '1': 'str' };→ 实际只有'1': 'str'(后者覆盖前者) -
const map = new Map(); map.set(1, 'num'); map.set('1', 'str');→ 两者共存,map.size === 2
Map 天然支持迭代、长度获取和顺序保证
Object 没有内置的元素个数属性,遍历时顺序也不完全可靠(尽管 ES2015+ 规定了部分顺序,但对数字键仍有特殊排序逻辑);Map 则明确:
-
map.size直接返回键值对数量,无需Object.keys(obj).length -
for (const [key, value] of map)原生支持迭代,且按插入顺序返回 -
map.keys()、map.values()、map.entries()提供标准迭代器接口
Map 更适合频繁增删的映射场景
虽然性能差异在小数据量下不明显,但在大量动态更新时,Map 的内部实现(哈希表优化)比 Object 的属性管理更高效,尤其避免了原型链查找、隐藏类切换等 V8 引擎开销。而且 Map 不受对象原型污染影响(比如有人往 obj.__proto__.toString = ...,可能意外干扰遍历)。
- 新增/删除:使用
map.set(key, val)和map.delete(key),语义明确、无副作用 - 清空:
map.clear()一步到位;Object 得循环delete obj[key]或重置为{} - 检查存在:
map.has(key)比key in obj或obj.hasOwnProperty(key)更直接安全











