JavaScript 中的Map
1. 什么是 Map
?
Map
是一种数据结构,用于存储键值对。它的特点是:
-
键可以是任意类型的值(包括对象、函数等),而不仅仅是字符串或符号(
Symbol
)。 -
键值对的顺序是插入顺序。
-
提供了丰富的方法来操作键值对。
2. 创建 Map
可以通过 new Map()
创建一个空的 Map
,或者传入一个二维数组来初始化 Map
。
示例:
// 创建一个空的 Map
const map1 = new Map();
// 通过二维数组初始化 Map
const map2 = new Map([
["name", "Alice"],
["age", 25],
[1, "One"],
[{ key: "objKey" }, "Object Value"],
]);
3. Map
的常用方法
(1) set(key, value)
向 Map
中添加或更新一个键值对。
示例:
const map = new Map();
map.set("name", "Alice");
map.set("age", 25);
map.set(1, "One");
console.log(map); // 输出: Map { 'name' => 'Alice', 'age' => 25, 1 => 'One' }
(2) get(key)
根据键获取对应的值。如果键不存在,返回 undefined
。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log(map.get("name")); // 输出: Alice
console.log(map.get("gender")); // 输出: undefined
(3) has(key)
判断 Map
中是否存在指定的键。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log(map.has("name")); // 输出: true
console.log(map.has("gender")); // 输出: false
(4) delete(key)
删除指定键的键值对。如果删除成功,返回 true
;如果键不存在,返回 false
。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log(map.delete("name")); // 输出: true
console.log(map.delete("gender")); // 输出: false
console.log(map); // 输出: Map { 'age' => 25 }
(5) clear()
清空 Map
中的所有键值对。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
map.clear();
console.log(map); // 输出: Map {}
(6) size
获取 Map
中键值对的数量。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log(map.size); // 输出: 2
(7) keys()
、values()
、entries()
-
keys()
:返回一个包含所有键的迭代器。 -
values()
:返回一个包含所有值的迭代器。 -
entries()
:返回一个包含所有键值对的迭代器。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log([...map.keys()]); // 输出: ['name', 'age']
console.log([...map.values()]); // 输出: ['Alice', 25]
console.log([...map.entries()]); // 输出: [['name', 'Alice'], ['age', 25]]
(8) forEach(callback)
遍历 Map
中的每个键值对。
示例:
const map = new Map([
["name", "Alice"],
["age", 25],
]);
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// 输出:
// name: Alice
// age: 25
4. Map
与 Object
的区别
特性 | Map | Object |
---|---|---|
键的类型 | 任意类型(包括对象、函数等) | 只能是字符串或符号(Symbol ) |
键值对的顺序 | 插入顺序 | 不保证顺序 |
大小 | 通过 size 属性获取 | 需要手动计算 |
性能 | 频繁增删键值对时性能更好 | 频繁增删键值对时性能较差 |
默认键 | 无默认键 | 有原型链上的默认键 |
5. 使用场景
(1) 键是复杂类型
当键是对象或函数时,Map
是更好的选择。
示例:
const objKey = { key: "objKey" };
const map = new Map();
map.set(objKey, "Object Value");
console.log(map.get(objKey)); // 输出: Object Value
(2) 需要保持插入顺序
Map
会按照插入顺序存储键值对。
示例:
const map = new Map();
map.set("a", 1);
map.set("b", 2);
map.set("c", 3);
console.log([...map.keys()]); // 输出: ['a', 'b', 'c']
(3) 频繁增删键值对
Map
在频繁增删键值对时性能更好。
示例:
const map = new Map();
for (let i = 0; i < 10000; i++) {
map.set(i, `value${i}`);
}
map.clear(); // 清空 Map
6. 总结
-
Map
是一种键值对的集合,键可以是任意类型。 -
提供了丰富的方法来操作键值对,如
set
、get
、has
、delete
、clear
等。 -
与
Object
相比,Map
更适合键是复杂类型、需要保持插入顺序或频繁增删键值对的场景。