Map能真正支持任意类型作键、保持插入顺序、提供准确size统计和原生迭代接口;普通对象仅支持字符串/Symbol键,数字键排序不可靠,且存在原型污染风险。

用 Map 替代普通对象存键值对,核心在于它能真正支持任意类型作键、保持插入顺序、提供准确的大小统计和更清晰的迭代接口。普通对象只接受字符串或 Symbol 作键,且属性顺序不完全可靠(尤其涉及数字键时),而 Map 没有这些限制。
键可以是任意类型,不只是字符串
普通对象会把非字符串/Symbol 键自动转成字符串,比如 { [{}]: 'a' } 实际变成 { '[object Object]': 'a' };Map 则原样保留。
- 用对象作键:
const map = new Map(); const keyObj = {}; map.set(keyObj, 'value'); console.log(map.get(keyObj)); // 'value' - 用函数、日期、NaN 甚至另一个 Map 都可以作键,彼此互不干扰
遍历顺序严格按插入顺序,无需额外处理
普通对象的 for...in 或 Object.keys() 在 ES2015+ 虽多数情况保序,但对整数键(如 '1', '2', '10')仍会按数值升序排列,造成意外。Map 的 keys()、values()、entries() 始终按插入顺序返回。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const m = new Map([['2', 'a'], ['10', 'b'], ['1', 'c']]); Array.from(m.keys()); // ['2', '10', '1'] —— 不重排- 配合
for...of直接迭代:for (const [key, val] of m) { console.log(key, val); }
获取长度、清空、判断存在更直观
普通对象要算属性个数得用 Object.keys(obj).length,清空要遍历删属性或重新赋值;Map 提供原生方法,语义明确、性能更好。
立即学习“Java免费学习笔记(深入)”;
-
m.size直接获取键值对数量(O(1)) -
m.clear()一次性清空所有条目 -
m.has(key)判断是否存在指定键(比key in obj或obj.hasOwnProperty(key)更安全,不受原型链影响)
适合动态增删频繁、键类型多样的场景
如果业务中经常用 DOM 元素、React 组件实例、自定义类实例作配置键,或者需要精确控制迭代顺序(比如缓存 + LRU 策略),Map 是更自然的选择。普通对象更适合静态配置、纯字符串键、需 JSON 序列化的场合。
- 避免误用:不要为了“看起来高级”强行替换所有对象——若只是存配置项且键全是字符串,对象依然简洁高效
- 注意兼容性:IE11 不支持 Map,如需兼容得加 polyfill 或用 Babel 转译

















