Object:
Object 的键必须是字符串或符号(symbol)。
如果使用其他类型(如数字、布尔值、对象)作为键,会自动转换为字符串。
const obj = {};
obj[123] = 'number'; // 键被转换为字符串 '123'
obj[true] = 'boolean'; // 键被转换为字符串 'true'
console.log(obj); // { '123': 'number', 'true': 'boolean' }
Map:
Map 可以接受任何类型的值作为键,包括原始类型值和对象。
const map = new Map();
map.set(123, 'number');
map.set(true, 'boolean');
map.set({}, 'object');
console.log(map); // Map { 123 => 'number', true => 'boolean', {} => 'object' }
Object:
Map:
Map 记录了元素的插入顺序,这样可以确保遍历时顺序不变。Object:
使用点操作符(.)或方括号([])访问和设置属性。
删除属性使用 delete 操作符。
判断属性是否存在使用 in 操作符或 hasOwnProperty 方法。
const obj = { key: 'value' };
console.log(obj.key); // 访问属性
obj.key = 'newValue'; // 设置属性
delete obj.key; // 删除属性
console.log('key' in obj); // 检查属性是否存在
Map:
使用 set 方法添加或更新键值对,get 方法获取值。
使用 delete 方法删除键值对。
使用 has 方法检查键是否存在。
const map = new Map();
map.set('key', 'value'); // 添加键值对
console.log(map.get('key')); // 获取值
map.delete('key'); // 删除键值对
console.log(map.has('key')); // 检查键是否存在
Object:
没有内置的属性来获取属性的数量。通常需要使用 Object.keys() 等方法。
因为 Object 的键只能是字符串或符号,所以在存储大量键值对时性能可能会受到影响。
const obj = { a: 1, b: 2 };
console.log(Object.keys(obj).length); // 2
Map:
Map 具有 size 属性,可以直接获取键值对的数量。
Map 的键值对的存储是高度优化的,对于频繁的增删查操作性能更好。
const map = new Map([['a', 1], ['b', 2]]);
console.log(map.size); // 2
Object:
Object 是原型链的一部分,其上可能存在一些继承的方法或属性(如 toString、hasOwnProperty 等)。这些可能会影响 Object 的使用,尤其是在使用字符串作为键时。Map:
Map 没有原型链的干扰,只有用户添加的键值对。因此,不会有 Object 原型链上的属性冲突问题。Object:
Object 不是天然可迭代的。可以使用 Object.keys()、Object.values()、Object.entries() 等方法来迭代键、值或键值对。Map:
Map 是天然可迭代的,可以直接使用 for...of 循环迭代键值对。也有 keys()、values()、entries() 方法。
const map = new Map([['a', 1], ['b', 2]]);
for (let [key, value] of map) {
console.log(key, value);
}
Object 作为键值对存储的场景通常是需要简单的字符串键值映射或需要对象原型链的功能时。Map 则更适合需要频繁增删改查操作的场景,特别是当键不确定为字符串时(如对象作为键),以及需要保障键值对的顺序时。