map与普通对象的区别
文章类型:Javascript
发布者:hp
发布时间:2025-04-12
Map:键可以是任意数据类型(对象、函数、基本类型等)。
Object:键只能是字符串或 Symbol,其他类型会被自动转换为字符串。
Map:严格保持键值对的插入顺序,遍历时按插入顺序返回。
Object:ES6 后字符串键按插入顺序保存,但数字键(如 '1')会被升序排列,可能导致顺序不一致。
Map:通过 size 属性直接获取。
Object:需手动计算,如 Object.keys(obj).length。
Map:支持 for...of 遍历,提供 entries()、keys()、values() 等迭代方法。
Object:默认不可用 for...of,需先通过 Object.keys() 等方法获取键数组再遍历。
Map:无原型链干扰,键名不会与继承的属性冲突。
Object:可能意外覆盖原型属性(如键名为 toString 时)。
Map:在频繁增删键值对的场景下性能更优。
Object:未针对频繁增删优化,可能效率较低。
Map:无法直接序列化为 JSON,需手动转换为对象或数组。
Object:默认支持 JSON.stringify() 序列化。
Map:提供 set()、get()、has()、delete() 等专用方法。
Object:通过属性访问(如 obj.key 或 obj['key']),使用 delete 操作符删除属性。
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,或需要与旧代码兼容时。