Map做数据缓存
Map 的好处:
-
键可以是任意类型(包括对象)
-
保持插入顺序
-
查找性能优于普通对象(尤其是大量键时)
// 创建缓存
const cache = new Map();
// 存入数据
cache.set('user_1', { name: 'Alice', age: 25 });
// 读取数据
if (cache.has('user_1')) {
const user = cache.get('user_1');
console.log(user.name); // Alice
}
// 删除缓存
cache.delete('user_1');
// 清空所有缓存
cache.clear();
🔧 二、基础方法(常用)
| 方法 | 说明 | 示例 |
|---|---|---|
| set(key, value) | 设置键值对(若 key 已存在则覆盖) | map.set('x', 10) |
| get(key) | 获取 key 对应的值,没有则返回 undefined |
map.get('x') |
| has(key) | 检查是否存在某个键 | map.has('x') |
| delete(key) | 删除指定键 | map.delete('x') |
| clear() | 清空所有条目 | map.clear() |
| size | 获取当前键值对数量 | map.size |
const cache = new Map();
cache.set('user', { name: 'Alice' });
console.log(cache.get('user')); // { name: 'Alice' }
console.log(cache.has('user')); // true
console.log(cache.size); // 1
cache.delete('user');
cache.clear();
三、遍历方法(迭代)
Map 是可迭代对象,可以用多种方式遍历:
| 方法 | 返回内容 | 示例 |
|---|---|---|
| keys() | 所有键的迭代器 | for (const k of map.keys()) console.log(k) |
| values() | 所有值的迭代器 | for (const v of map.values()) console.log(v) |
| entries() | 所有 [key, value] 对的迭代器 | for (const [k, v] of map.entries()) console.log(k, v) |
| forEach(callback) | 按插入顺序遍历所有项 | map.forEach((v, k) => console.log(k, v)) |
const map = new Map([
['a', 1],
['b', 2],
['c', 3],
]);
for (const [key, value] of map) {
console.log(key, value); // a 1, b 2, c 3
}
map.forEach((value, key) => {
console.log(`${key} -> ${value}`);
});
四、与其他数据结构的转换
1️⃣ Map → 数组
2️⃣ 数组 → Map
3️⃣ Map → 对象
4️⃣ 对象 → Map
五、键的类型
Map 的 key 可以是任意类型(包括对象、函数、NaN):
const map = new Map();
const objKey = { id: 1 };
const fnKey = () => {};
const nanKey = NaN;
map.set(objKey, 'Object key');
map.set(fnKey, 'Function key');
map.set(nanKey, 'NaN key');
console.log(map.get(objKey)); // 'Object key'
console.log(map.get(NaN)); // 'NaN key' ✅
注意:Map 用的是 SameValueZero 比较规则,
所以 NaN 被认为等于 NaN,+0 等于 -0。
六、Map 与 WeakMap 的区别
| 特性 | Map |
WeakMap |
|---|---|---|
| 键类型 | 任意 | 只能是对象 |
| 是否可枚举 | ✅ 可以遍历 | ❌ 不能遍历 |
| 自动垃圾回收 | ❌ 不会 | ✅ 会(若键对象被回收) |
| 典型用途 | 一般缓存、映射表 | 绑定对象的私有数据 |
const weakCache = new WeakMap();
let obj = {};
weakCache.set(obj, 'data');
obj = null; // obj 被回收,WeakMap 自动清理对应数据
七、总结速查表
| 方法 / 属性 | 描述 |
|---|---|
new Map([iterable]) |
创建新 Map |
.set(key, value) |
设置键值对 |
.get(key) |
获取值 |
.has(key) |
检查键是否存在 |
.delete(key) |
删除某项 |
.clear() |
清空所有项 |
.size |
当前元素数量 |
.keys() |
返回键的迭代器 |
.values() |
返回值的迭代器 |
.entries() |
返回 [key, value] 迭代器 |
.forEach(fn) |
遍历 Map |

浙公网安备 33010602011771号