JavaScript中Map对象用法详解

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.常用方法

  1. set(key, value):添加或更新键值对,返回Map对象本身(支持链式调用)。
  2. get(key):返回键对应的值,若不存在则返回undefined
  3. has(key):判断Map中是否包含指定的键,返回布尔值。
  4. delete(key):删除指定键对应的键值对,返回布尔值(成功删除为true,否则false)。
  5. clear():清空Map中所有键值对。
  6. keys():返回一个包含Map中所有键的迭代器。
  7. values():返回一个包含Map中所有值的迭代器。
  8. entries():返回一个包含Map中所有键值对(数组[key, value])的迭代器。
  9. forEach(callback[, thisArg]):遍历Map中每个键值对,执行回调函数。

3.1属性

  • size:返回Map对象中键值对的数量。

3.2示例

  1. 基本操作
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
  1. 遍历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}`);
});
// 输出同上
  1. 与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。
posted @ 2025-07-08 07:22  Rain Man  阅读(684)  评论(0)    收藏  举报