选Map还是普通对象取决于数据用途和操作模式:键类型多样、需严格插入顺序、频繁增删查时选Map;静态配置、需JSON序列化、结构固定且键全为字符串时选普通对象。

实际开发中选 Map 还是普通对象,关键看数据用途和操作模式,不是“哪个更好”,而是“哪个更合适”。核心判断依据就三点:键的类型是否多样、是否需要严格顺序、是否频繁增删查。
需要对象/函数/数组作键时,必须用 Map
普通对象会把非字符串键自动转成字符串,导致键冲突或丢失语义。比如用 DOM 元素、Date 实例、自定义配置对象当键,只有 Map 能准确识别和区分。
-
典型场景:缓存 DOM 节点关联状态(
map.set(buttonEl, { loading: true })) -
典型场景:用函数作为策略标识(
map.set(handleClick, 'click-handler')) -
典型场景:区分数字
0和字符串"0"(map.get(0) !== map.get("0"))
要保证遍历顺序且逻辑依赖插入先后,优先选 Map
普通对象对纯数字键仍按升序排列,哪怕你先设 obj[100] = 'a' 再设 obj[1] = 'b',Object.keys(obj) 也会返回 ['1', '100']。Map 则始终按 set 的顺序返回。
- 典型场景:表单字段校验结果按填写顺序展示
- 典型场景:事件监听器注册顺序影响执行逻辑
- 典型场景:构建有序配置栈(如中间件链、拦截器列表)
操作频繁或需统计数量时,Map 更省心
Map 提供 .size 属性、.has()、.delete() 等语义明确的方法,避免手动过滤原型属性、计算键数或处理 delete 的性能隐患。
立即学习“Java免费学习笔记(深入)”;
-
普通对象痛点:
Object.keys(obj).length可能漏掉不可枚举属性,delete obj.key在 V8 中可能触发隐藏类重建 -
Map 优势:
map.size是 O(1) 原生属性;map.delete(key)性能稳定;map.has(key)比key in obj && obj.hasOwnProperty(key)更简洁安全 -
注意边界:如果只是静态配置(如
{ theme: 'dark', lang: 'zh' }),用对象更轻量、可直接 JSON 序列化
不建议用 Map 的情况
Map 不是万能替代品。以下情况反而该用普通对象:
- 需要直接
JSON.stringify()序列化传输(Map 无法被原生序列化) - 结构固定、键名已知且全是字符串(如接口响应结构体)
- 要利用原型方法(如
obj.toString())或与已有 API 深度耦合(某些库只认 plain object) - 极简脚本中仅存两三个键值,引入 Map 反而增加心智负担


















