Object
和 Map
是 JavaScript 中用于存储键值对的两种数据结构,它们有以下区别:
语法和用法:
Object
是 JavaScript 的内置对象,可以直接使用字面量语法或构造函数创建对象。例如:const obj = { key: 'value' }; // 使用字面量语法创建对象 const obj2 = new Object(); // 使用构造函数创建对象
Map
是 ES6 引入的数据结构,使用new Map()
构造函数创建。例如:const map = new Map();
键的类型:在
Object
中,键必须是字符串或符号类型。当使用非字符串或非符号类型作为键时,会自动将其转换为字符串。例如:const obj = { 1: 'value' }; // 键被自动转换为字符串 "1" const symbolKey = Symbol(); obj[symbolKey] = 'value2'; // 符号类型的键
在
Map
中,键可以是任意类型的值,包括对象、函数、原始类型等。键的比较是通过严格相等运算符(===
)进行的,保留了原始键的类型。例如:const map = new Map(); const objKey = { key: 'value' }; const funcKey = () => 'value2'; map.set(objKey, 'value'); map.set(funcKey, 'value2');
迭代顺序:
Object
中的键值对没有固定的迭代顺序,不保证按照插入顺序进行迭代。在实际应用中,对象的属性遍历顺序可能会受到实现的影响。例如:const obj = { b: 2, a: 1 }; for (let key in obj) { console.log(key); // 输出顺序不确定,可能是 "b" 先于 "a" }
Map
中的键值对按照插入顺序保持迭代顺序。迭代Map
时会按照键值对的插入顺序返回。例如:const map = new Map(); map.set('b', 2); map.set('a', 1); for (let [key, value] of map) { console.log(key); // 输出顺序为 "b" 先于 "a" }
功能和方法:
Object
提供了一系列操作对象的方法,如属性访问、属性赋值、删除属性等。例如:Object.keys()
、Object.values()
、Object.entries()
等。Map
提供了一系列操作键值对的方法,如设置键值对、获取值、删除键值对等。例如:map.set()
、map.get()
、map.delete()
等。
需要根据具体的使用场景和需求选择合适的数据结构。一般来说,如果需要根据键的顺序进行迭代,或者键的类型需要保持不变,可以选择使用 Map
。如果只需要简单的键值对结构,并且不需要特定的迭代顺序,可以使用 Object
。