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 |