Map与Object的区别及转换
在 JavaScript 中,Map 和 Object 都可以用来存储键值对,但它们在设计目的和使用场景上有显著区别。以下是它们的核心差异、使用场景及互相转换方法:
一、核心区别
| 特性 | Map | Object | 
|---|---|---|
| 键的类型 | 任意类型(对象、函数等) | 只能是 String 或 Symbol | 
| 顺序性 | 严格保持插入顺序 | ES6 后有序,但历史实现不一致 | 
| 继承属性 | 无(纯净的键值存储) | 可能继承原型链属性(如 constructor) | 
| 性能 | 频繁增删键值对时更高效 | 频繁访问已知属性时更快 | 
| 迭代 | 直接支持 for...of 遍历 | 
需要先获取键数组(如 Object.keys()) | 
| 大小获取 | 通过 size 属性直接获取 | 
需手动计算(如 Object.keys(obj).length) | 
二、使用场景
优先使用 Map 的情况:
- 键需要是非字符串类型(如对象、函数)。
 - 需要频繁增删键值对(如缓存动态数据)。
 - 需要严格保持插入顺序(如队列、时间序列数据)。
 - 需要避免原型污染(安全场景)。
 - 需要直接获取键值对的数量(
size)。 
优先使用 Object 的情况:
- 键是简单字符串或 
Symbol,且结构相对静态。 - 需要利用 JSON 序列化/反序列化(
Object直接支持)。 - 需要利用对象特性(如方法、原型继承、解构赋值等)。
 - 对性能敏感且操作模式符合对象优化策略(如 V8 引擎优化)。
 
三、互相转换
1. Object → Map
使用 Object.entries() 快速转换:
const obj = { a: 1, b: 2 };
const map = new Map(Object.entries(obj));
// Map(2) { 'a' => 1, 'b' => 2 }
2. Map → Object
遍历 Map 并构建对象:
const map = new Map([['a', 1], ['b', 2]]);
const obj = Object.fromEntries(map);
// { a: 1, b: 2 }
注意:若 Map 的键是非字符串,转换时会自动调用 toString(),可能导致意外结果:
const keyObj = { id: 1 };
const map = new Map([[keyObj, 'value']]);
const obj = Object.fromEntries(map);
// { '[object Object]': 'value' } → 键被转换为字符串
四、总结
- 选择 
Map:动态数据、复杂键、有序性需求。 - 选择 
Object:静态结构、JSON 兼容性、简单键。 - 转换方法:利用 
Object.entries()和Object.fromEntries()简化操作,但需注意键类型的隐式转换。 
                    
                
                
            
        
浙公网安备 33010602011771号