Map支持任意类型值(对象、数组、函数、null、undefined)作键,严格区分键类型与引用,避免隐式转换和原型干扰,提供size属性和原生迭代器,保持插入顺序,适用于缓存、状态管理等场景。

Map 可以让任意类型的值作为键,包括对象、数组、函数、甚至 null 和 undefined,彻底突破普通对象只能用字符串或 Symbol 作键的限制。
键类型不受限:支持任意值作键
普通对象会把非字符串/Symbol 键隐式转为字符串(比如 {[1,2]: 'a'} 实际变成 {'1,2': 'a'}),而 Map 保留原始值身份:
- 对象作键:不同对象即使内容相同,也是独立键
- 数组作键:
[1, 2]和[1, 2](两个引用)是不同键 - 函数、正则、日期、null、undefined 都可直接当键,不会被强制转换
避免键名意外覆盖和类型混淆
普通对象中 {0: 'a', '0': 'b'} 实际只有一个键('0'),因为数字键会被转成字符串;Map 则严格区分:
-
map.set(0, 'a')和map.set('0', 'b')存储两个独立条目 -
map.set(true, 'yes')和map.set('true', 'string')互不影响 - 没有原型链干扰(普通对象可能继承
toString等属性导致冲突)
获取键数量和遍历更可靠
普通对象要算自有属性数得用 Object.keys(obj).length,还容易漏掉不可枚举属性或原型属性;Map 提供原生支持:
-
map.size直接返回键值对数量,精确且高效 -
map.keys()、map.values()、map.entries()返回迭代器,天然支持for...of和解构 - 插入顺序严格保留,遍历时按写入顺序返回,不依赖属性名排序规则
实际用法示例:缓存对象实例或绑定上下文
比如实现一个基于对象引用的缓存,或为不同函数实例维护独立状态:
- 缓存 DOM 元素计算结果:
cache.set(element, computedData) - 为每个 React 组件实例存私有状态:
stateMap.set(componentInstance, { count: 0 }) - 用函数作键记录其调用次数:
callCount.set(handler, (callCount.get(handler) || 0) + 1)
不复杂但容易忽略:Map 是专门为此类需求设计的数据结构,不是“高级对象”,而是更准确、更可控的键值映射工具。

















