1. Map 的基本概念
Map 是 ES6 引入的一种新的数据结构,它类似于对象,也是键值对的集合,但 Map 的键可以是任意类型的值(对象、函数、原始类型等),而传统对象的键只能是字符串或 Symbol。
2. 创建 Map
// 创建一个空的 Map
const map1 = new Map();
// 使用数组初始化 Map
const map2 = new Map([
['name', '张三'],
['age', 25],
[1, '数字键'],
[{}, '对象键']
]);
3. 基本操作方法
添加/设置元素
const map = new Map();
map.set('name', '李四'); // 字符串键
map.set(1, '数字键值'); // 数字键
map.set({id: 1}, '对象键值'); // 对象键
获取元素
map.get('name'); // 返回 '李四'
map.get(1); // 返回 '数字键值'
map.get('nonexistent'); // 返回 undefined
检查键是否存在
map.has('name'); // true
map.has('age'); // false
删除元素
map.delete('name'); // 删除键为'name'的条目,返回true表示删除成功
清空 Map
map.clear(); // 清空所有键值对
获取大小
map.size; // 返回Map中键值对的数量
4. 遍历方法
forEach 方法
map.forEach((value, key) => {
console.log(key, value);
});
for...of 循环
for (let [key, value] of map) {
console.log(key, value);
}
// 单独遍历键或值
for (let key of map.keys()) {
console.log(key);
}
for (let value of map.values()) {
console.log(value);
}
5. Map 与 Object 的区别
特性 | Map | Object |
---|---|---|
键的类型 | 任意值 | 字符串或Symbol |
顺序 | 插入顺序 | 无序 |
大小 | 通过size属性获取 | 需要手动计算 |
性能 | 频繁增删时表现更好 | 少量数据时可能有更好性能 |
默认属性 | 无 | 有原型链上的默认属性 |
序列化 | 不能直接JSON.stringify | 可以直接序列化 |
6. 实际应用示例
示例1:统计字符出现次数
function countChars(str) {
const charMap = new Map();
for (let char of str) {
charMap.set(char, (charMap.get(char) || 0) + 1);
}
return charMap;
}
const result = countChars('hello world');
console.log(result.get('l')); // 3
示例2:缓存计算结果
const cache = new Map();
function expensiveOperation(key) {
if (cache.has(key)) {
return cache.get(key);
}
const result = /* 复杂计算 */;
cache.set(key, result);
return result;
}
示例3:存储DOM节点元数据
const nodeMetadata = new Map();
function storeMetadata(node, data) {
nodeMetadata.set(node, data);
}
function getMetadata(node) {
return nodeMetadata.get(node);
}
7. 注意事项
- Map 的键是基于引用比较的,两个看起来相同的对象作为键会被视为不同的键:const map = new Map(); const obj1 = {id: 1}; const obj2 = {id: 1}; map.set(obj1, 'value1'); map.set(obj2, 'value2'); console.log(map.size); // 2
- NaN 作为 Map 的键时会被视为相同的键:map.set(NaN, 'not a number'); map.get(NaN); // 'not a number'
- Map 是可迭代对象,可以直接使用扩展运算符:const map = new Map([['a', 1], ['b', 2]]); console.log([...map]); // [['a', 1], ['b', 2]]
Map 提供了比普通对象更强大的键值存储能力,特别适合需要复杂键类型或需要维护插入顺序的场景