1.核心特点
- 键值对集合:Map对象用于存储键值对,并能够记住键的原始插入顺序。
- 键的多样性:与普通对象(Object)不同,Map的键可以是任意值(包括对象、函数、基本类型等)。
- 有序性:Map中的键值对按照插入顺序进行迭代。
- 高效查找:可以快速判断键是否存在,并获取对应的值。
- 大小可获取:通过
size属性直接获取Map中键值对的数量。
- 可迭代:Map对象是可迭代的,可以使用
for...of循环或forEach方法遍历。
- 不自动转换键:Map不会将键转换为字符串(与Object不同),因此数字
1和字符串'1'会被视为两个不同的键。
2.语法
// 创建Map
const myMap = new Map();
// 或者通过可迭代对象(如二维数组)初始化
const initMap = new Map([
['key1', 'value1'],
['key2', 'value2']
]);
3.常用方法
- set(key, value):添加或更新键值对,返回Map对象本身(支持链式调用)。
- get(key):返回键对应的值,若不存在则返回
undefined。
- has(key):判断Map中是否包含指定的键,返回布尔值。
- delete(key):删除指定键对应的键值对,返回布尔值(成功删除为true,否则false)。
- clear():清空Map中所有键值对。
- keys():返回一个包含Map中所有键的迭代器。
- values():返回一个包含Map中所有值的迭代器。
- entries():返回一个包含Map中所有键值对(数组
[key, value])的迭代器。
- forEach(callback[, thisArg]):遍历Map中每个键值对,执行回调函数。
3.1属性
3.2示例
- 基本操作
const map = new Map();
// 添加键值对
map.set('name', 'Alice');
map.set('age', 25);
map.set(1, 'number one'); // 键可以是数字
const objKey = { id: 1 };
map.set(objKey, 'object value'); // 键可以是对象
console.log(map.size); // 输出: 4
// 获取值
console.log(map.get('name')); // 'Alice'
console.log(map.get(objKey)); // 'object value'
// 检查键是否存在
console.log(map.has('age')); // true
console.log(map.has('gender')); // false
// 删除键值对
map.delete(1);
console.log(map.size); // 3
// 清空Map
map.clear();
console.log(map.size); // 0
- 遍历Map
const map = new Map([
['a', 1],
['b', 2],
['c', 3]
]);
// 使用for...of遍历键
for (const key of map.keys()) {
console.log(key); // 依次输出: 'a', 'b', 'c'
}
// 使用for...of遍历值
for (const value of map.values()) {
console.log(value); // 依次输出: 1, 2, 3
}
// 使用for...of遍历键值对
for (const [key, value] of map.entries()) {
console.log(`${key}: ${value}`);
}
// 输出:
// a: 1
// b: 2
// c: 3
// 使用forEach
map.forEach((value, key) => {
console.log(`${key} => ${value}`);
});
// 输出同上
- 与Object的对比
const obj = {};
const map = new Map();
// 键为对象
const key1 = { a: 1 };
const key2 = { a: 1 };
obj[key1] = 'value'; // 实际上键被转换为字符串'[object Object]'
obj[key2] = 'value'; // 同上,覆盖了前面的值
map.set(key1, 'value1');
map.set(key2, 'value2'); // 两个不同的键
console.log(obj); // { '[object Object]': 'value' } (只有一个属性)
console.log(map.size); // 2
4.注意事项
- 键的比较:Map使用“SameValueZero”算法比较键(类似于严格相等
===,但NaN等于NaN)。
- 引用类型作为键:当使用对象或数组等引用类型作为键时,只有同一个引用才能获取对应的值(即两个看起来一样的对象,因为引用不同,会被视为不同的键)。
- 性能:在频繁增删键值对的场景下,Map比Object有更好的性能。
- 序列化:Map对象无法直接使用
JSON.stringify()序列化,需要先转换为数组或对象。
- 内存占用:Map可能会比Object占用更多的内存,尤其是当键值对数量巨大时。
5.总结
- 适用场景:需要键类型多样、有序遍历、频繁增删键值对的场景。
- 优势:键的类型不受限制、有序、可直接获取大小、高效查找。
- 替代方案:当键是字符串或符号,且不需要有序遍历时,可以使用Object;当只需要存储键时,可以考虑使用Set。