Map 可替代普通对象存键值对,支持任意类型键、严格插入顺序遍历、原生 size/clear/has 方法,适合动态键、非字符串键及顺序敏感场景。

Map 可以直接替代普通对象存键值对,尤其在需要灵活键类型、保持插入顺序或频繁增删场景下更合适。它不是语法糖,而是专门设计的键值集合,解决了对象的多个固有限制。
键可以是任意类型,不只是字符串或 Symbol
普通对象的键会被自动转为字符串(比如 {[1,2]: 'a'} 实际变成 {'1,2': 'a'}),而 Map 允许用函数、对象、数字、布尔值甚至 undefined 作键,且不会被强制转换。
- 用对象作键:能真正区分不同引用
const key1 = {}; const key2 = {}; map.set(key1, 'val1'); map.set(key2, 'val2'); - 用函数作键:可缓存函数执行结果
map.set(fn, result); - 用 NaN 作键:Map 中
NaN === NaN,可正确查到;对象中obj[NaN] = 'x'实际等价于obj['NaN'] = 'x'
遍历顺序严格按插入顺序,无需额外处理
普通对象属性遍历顺序在 ES2015 后虽大多按插入顺序,但存在例外(如数字键会提前排序),而 Map 明确保证迭代顺序与 set() 顺序完全一致,适合做队列、LRU 缓存等依赖时序的逻辑。
-
map.keys()、map.values()、map.entries()都返回有序迭代器 - 可用
for...of直接遍历:for (const [key, value] of map) { ... } - 转数组也保留顺序:
[...map]或Array.from(map)
获取长度、清空、判断存在更直观
对象要靠 Object.keys(obj).length 获取大小,清空需遍历赋值或重置,判断是否存在得用 hasOwnProperty 或 in 操作符,容易出错。Map 提供原生方法,语义清晰、性能更好。
立即学习“Java免费学习笔记(深入)”;
- 长度直接读
map.size - 清空用
map.clear() - 判断键是否存在用
map.has(key),比key in obj更可靠(不污染原型链) - 删除用
map.delete(key),返回布尔值表示是否成功
适合动态增删频繁、键不确定的场景
如果业务中键由用户输入、接口返回或运行时生成(比如表单字段名、事件类型、模块 ID),用 Map 更安全——避免意外覆盖原型属性(如 obj.constructor、obj.toString),也不用担心数字键排序问题。
- 创建空 Map:
const map = new Map(); - 初始化传二维数组:
new Map([['a', 1], ['b', 2]]) - 从对象转 Map(仅自有可枚举字符串键):
new Map(Object.entries(obj)) - 从 Map 转对象(仅支持字符串或 Symbol 键):
Object.fromEntries(map)
不复杂但容易忽略:Map 不是对象的“升级版”,而是用途不同的数据结构。日常配置项、固定字段仍可用字面量对象;涉及动态键、非字符串键、顺序敏感或高频操作时,Map 是更稳妥的选择。


















