map与普通对象的区别

文章类型:Javascript

发布者:hp

发布时间:2025-04-12

一:区别

1. ‌键的类型‌

‌Map‌:键可以是任意数据类型(对象、函数、基本类型等)。

‌Object‌:键只能是字符串或 Symbol,其他类型会被自动转换为字符串。

2. ‌键的顺序‌

‌Map‌:严格保持键值对的插入顺序,遍历时按插入顺序返回。

‌Object‌:ES6 后字符串键按插入顺序保存,但数字键(如 '1')会被升序排列,可能导致顺序不一致。

3. ‌大小获取‌

‌Map‌:通过 size 属性直接获取。

‌Object‌:需手动计算,如 Object.keys(obj).length。

4. ‌迭代与遍历‌

‌Map‌:支持 for...of 遍历,提供 entries()、keys()、values() 等迭代方法。

‌Object‌:默认不可用 for...of,需先通过 Object.keys() 等方法获取键数组再遍历。

5. ‌原型安全性‌

‌Map‌:无原型链干扰,键名不会与继承的属性冲突。

‌Object‌:可能意外覆盖原型属性(如键名为 toString 时)。

6. ‌性能优化‌

‌Map‌:在频繁增删键值对的场景下性能更优。

‌Object‌:未针对频繁增删优化,可能效率较低。

7. ‌JSON 序列化‌

‌Map‌:无法直接序列化为 JSON,需手动转换为对象或数组。

‌Object‌:默认支持 JSON.stringify() 序列化。

8. ‌方法和 API‌

‌Map‌:提供 set()、get()、has()、delete() 等专用方法。

‌Object‌:通过属性访问(如 obj.key 或 obj['key']),使用 delete 操作符删除属性。

9. ‌默认内容‌

‌Map‌:初始为空,无默认键。

‌Object‌:可能继承原型上的属性(如 constructor)。

二:代码

// 插入顺序与键类型对比
const obj = {};
obj['2'] = 'two'; 
obj['1'] = 'one'; 
console.log(Object.keys(obj)); // ['1', '2'] (数字键升序排列)

const map = new Map();
map.set('2', 'two');
map.set(1, 'one');
console.log([...map.keys()]); // ['2', 1] (严格保持插入顺序)

三:总结

1:使用 Map‌:当需要任意类型的键、严格顺序、频繁增删,或避免原型冲突时。

:2:使用 Object‌:当键为字符串/Symbol、需直接序列化为 JSON,或需要与旧代码兼容时。