Map与Object的区别及转换

在 JavaScript 中,MapObject 都可以用来存储键值对,但它们在设计目的和使用场景上有显著区别。以下是它们的核心差异、使用场景及互相转换方法:


一、核心区别

特性 Map Object
键的类型 任意类型(对象、函数等) 只能是 StringSymbol
顺序性 严格保持插入顺序 ES6 后有序,但历史实现不一致
继承属性 无(纯净的键值存储) 可能继承原型链属性(如 constructor
性能 频繁增删键值对时更高效 频繁访问已知属性时更快
迭代 直接支持 for...of 遍历 需要先获取键数组(如 Object.keys()
大小获取 通过 size 属性直接获取 需手动计算(如 Object.keys(obj).length

二、使用场景

优先使用 Map 的情况:

  1. 键需要是非字符串类型(如对象、函数)。
  2. 需要频繁增删键值对(如缓存动态数据)。
  3. 需要严格保持插入顺序(如队列、时间序列数据)。
  4. 需要避免原型污染(安全场景)。
  5. 需要直接获取键值对的数量(size)。

优先使用 Object 的情况:

  1. 键是简单字符串或 Symbol,且结构相对静态。
  2. 需要利用 JSON 序列化/反序列化(Object 直接支持)。
  3. 需要利用对象特性(如方法、原型继承、解构赋值等)。
  4. 对性能敏感且操作模式符合对象优化策略(如 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() 简化操作,但需注意键类型的隐式转换。
posted @ 2025-04-30 17:14  张浩伟  阅读(219)  评论(0)    收藏  举报