JS Map使用方法
Map
是 ES6 引入的一种新的数据结构,它类似于对象(Object
),但提供了更强大的键值对存储功能。
文章目录
- JS Map使用方法
- 基本特性
- 基本用法
-
- 与 Object 的区别
- 实际应用示例
- 示例1:统计字符出现次数
- 示例2:缓存计算结果
- 示例3:对象作为键
- 注意事项
基本特性
- 任意类型的键:
Map
的键可以是任意值(包括对象、函数等),而普通对象的键只能是字符串或 Symbol - 有序性:
Map
会记住键的原始插入顺序 - 大小可获取:可以直接通过
size
属性获取 Map
中的元素数量 - 性能优化:在频繁增删键值对的场景下,
Map
的性能通常优于普通对象
基本用法
创建 Map
const map = new Map();
const map2 = new Map([['key1', 'value1'],['key2', 'value2']
]);
常用方法
方法 | 描述 | 示例 |
---|
set(key, value) | 添加或更新键值对 | map.set('name', 'Alice') |
get(key) | 获取键对应的值 | map.get('name') // ‘Alice’ |
has(key) | 检查是否存在某个键 | map.has('name') // true |
delete(key) | 删除指定键值对 | map.delete('name') |
clear() | 清空所有键值对 | map.clear() |
size | 获取键值对数量 | map.size |
遍历方法
const map = new Map([['name', 'Alice'],['age', 25],['job', 'Developer']
]);
for (const [key, value] of map) {console.log(key, value);
}
map.forEach((value, key) => {console.log(key, value);
});
console.log([...map.keys()]);
console.log([...map.values()]);
console.log([...map.entries()]);
与 Object 的区别
特性 | Map | Object |
---|
键的类型 | 任意值 | 只能是字符串或 Symbol |
键的顺序 | 有序(插入顺序) | 无序(ES6后也有序但不保证) |
大小 | size 属性 | 需要手动计算 |
性能 | 频繁增删时表现更好 | 频繁增删时性能较差 |
默认键 | 无 | 有原型链上的键 |
序列化 | 不能直接 JSON.stringify | 可以直接序列化 |
实际应用示例
示例1:统计字符出现次数
function countChars(str) {const map = new Map();for (const char of str) {map.set(char, (map.get(char) || 0) + 1);}return map;
}const result = countChars('hello');
console.log(result.get('l'));
示例2:缓存计算结果
const cache = new Map();function factorial(n) {if (cache.has(n)) return cache.get(n);if (n === 0) return 1;const result = n * factorial(n - 1);cache.set(n, result);return result;
}console.log(factorial(5));
console.log(cache);
示例3:对象作为键
const user1 = { id: 1, name: 'Alice' };
const user2 = { id: 2, name: 'Bob' };const userSettings = new Map();
userSettings.set(user1, { theme: 'dark' });
userSettings.set(user2, { theme: 'light' });console.log(userSettings.get(user1));
注意事项
- 键的比较:
Map
使用 “SameValueZero” 算法比较键(类似于 ===
,但 NaN
等于 NaN
) - 内存管理:如果使用对象作为键,即使对象被设为
null
,Map
仍然会保留对它的引用 - 序列化:
Map
不能直接使用 JSON.stringify()
,需要先转换为数组
NaN
等于 NaN
) - 内存管理:如果使用对象作为键,即使对象被设为
null
,Map
仍然会保留对它的引用 - 序列化:
Map
不能直接使用 JSON.stringify()
,需要先转换为数组 - WeakMap:如果需要弱引用,可以使用
WeakMap
,它只接受对象作为键且不可遍历