Object和Map

  在早期的 JavaScript 中,Object 是唯一可用的键值对结构,常被当作“字典”使用。随着 ES6 的推出,Map 以更现代化和高性能的形式登场,解决了 Object 在键类型、性能、原型污染等方面的局限。理解两者的异同,不仅能写出更清晰的代码,也能在性能和安全性上获得提升。

基本语法

定义方式

1
2
3
4
5
6
// Object
const obj = { key: 'value' };

// Map
const map = new Map();
map.set('key', 'value');

常用方法对比

操作 Object Map
添加键值对 obj[key] = value map.set(key, value)
获取键对应值 obj[key] map.get(key)
删除键 delete obj[key] map.delete(key)
是否存在键 'key' in obj map.has(key)
清空所有键值 obj = {} 或手动删除所有键 map.clear()
遍历 for...inObject.entries map.forEach()for...of
获取键/值数组 Object.keys/values/entries map.keys()/values()/entries()

关键区别

键的类型

  • Object 的键只能是字符串或 symbol,数字会被自动转成字符串。

    1
    2
    3
    const obj = {};
    obj[1] = 'a';
    console.log(obj['1']); // 'a'
  • Map 的键可以是任意类型(对象、函数、NaN等)。

    1
    2
    3
    4
    const map = new Map();
    map.set(1, 'a');
    console.log(map.get(1)); // 'a'
    console.log(map.get('1')); // undefined

键值对的有序性

  • Object 的键是无序的(虽然现代浏览器有一定顺序表现,但不可靠)。
  • Map 的键值对是按照插入顺序有序的。

原型链干扰

  • Object 继承自 Object.prototype,可能会被污染,例如 obj.toString
  • Map 不继承自 Object.prototype,更安全地避免了原型链上的冲突。

性能差异

操作 Map Object
增删查改性能 更快(尤其大量数据) 较慢
小数据量性能 相差不大 相对略快

遍历方式

Object 遍历

1
2
3
4
5
6
7
8

Object.keys(obj).forEach(key => console.log(key, obj[key]));

for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}

Map 遍历

1
2
3
4
5
map.forEach((value, key) => console.log(key, value));

for (let [key, value] of map) {
console.log(key, value);
}

创建 MAP

从数组:

1
2
3
4
const map = new Map([
['a', 1],
['b', 2],
]);

从对象:

1
const map = new Map(Object.entries(obj));

转回对象:

1
const obj = Object.fromEntries(map);

序列化支持

  • Object 可以直接用 JSON.stringify() 序列化。

  • Map 无法直接序列化,需要先转换成数组或普通对象。

    1
    2
    3
    4
    5
    6
    const obj = { a: 1 };
    JSON.stringify(obj); // '{"a":1}'

    const map = new Map([['a', 1]]);
    JSON.stringify(map); // '{}'
    JSON.stringify(Object.fromEntries(map)); // '{"a":1}'

小结

维度 Object Map
键类型 字符串或 Symbol 任意类型
有序性
原型污染风险
序列化方便
性能(大量数据) 较慢 较快
用法 简单语法 丰富方法
  • 如果只是存储一些配置项、接口参数,用 Object 更简单。
  • 如果需要更灵活、性能更高、更安全的键值结构,尤其处理大量动态键值时,建议使用 Map
作者

Fu9Zhou

发布于

2025-07-05

许可协议