定义Map
想象我们有一个多功能收纳盒:
- 传统对象(Object) → 只能贴文字标签(键必须是字符串)
- Map → 可贴任意标签(照片、钥匙、玩具等),还能记录粘贴顺序
// 传统对象:键自动转字符串
const obj = { 1: "苹果" };
console.log(obj["1"]); // "苹果"(数字1被转字符串)
// Map:键保留原始类型
const map = new Map();
map.set(1, "苹果"); // 键是数字类型
console.log(map.get(1)); // "苹果"
核心特性与优势
1. 键可以是任意类型
支持对象、函数、数组等复杂类型作键(对象只能使用字符串或 Symbol)
const keyObj = { id: 123 };
map.set(keyObj, "用户数据"); // ✅ 对象作键
console.log(map.get(keyObj)); // "用户数据"
2. 严格保留插入顺序
遍历顺序 = 添加顺序(对象不保证顺序)
map.set("a", 1).set("b", 2);
for (const [k, v] of map) {{
console.log(k, v); // 依次输出 "a 1" → "b 2"
}}
3. 专属操作方法(比对象更直观)
| 方法 | 作用 | 示例 |
|---|---|---|
map.set(k,v) | 添加/更新键值对 | map.set("name", "小明") |
map.get(k) | 获取键对应值 | map.get("name") // 小明 |
map.has(k) | 检查键是否存在 | map.has("age") // false |
map.delete(k) | 删除键值对 | map.delete("name") |
map.size | 获取键值对数量 | map.size // 1 |
map.clear() | 清空所有键值对 | map.clear() |
4. 高性能增删
频繁增删键值对时,性能优于对象
Map vs Object
| 特性 | Map | Object |
|---|---|---|
| 键类型 | ✅ 任意类型(对象、函数等) | ❌ 仅字符串或 Symbol |
| 顺序保证 | ✅ 严格按插入顺序 | ❌ 不保证顺序 |
| 大小获取 | ✅ map.size 直接获取 | ❌ 需 Object.keys(obj).length |
| 迭代 | ✅ 直接 for...of 遍历 | ❌ 需先 Object.keys() 转换 |
| 默认键 | ❌ 无原型链属性干扰 | ⚠️ 可能被原型属性覆盖(如 toString) |
何时使用Map
- 键需非字符串(如用对象作键)
- 需严格遍历顺序(如订单流程步骤)
- 频繁增删键值对(如缓存管理)
一些常见的使用场景
1. 用对象关联数据
const user1 = { id: 101 };
const user2 = { id: 102 };
const userMap = new Map();
userMap.set(user1, { name: "小明" });
userMap.set(user2, { name: "小红" });
console.log(userMap.get(user1).name); // "小明"
2. 高效缓存管理
const cache = new Map();
function getData(key) {{
if (cache.has(key)) return cache.get(key);
const data = fetchData(key); // 耗时操作
cache.set(key, data);
return data;
}}
3. 替代复杂条件判断
const actionMap = new Map([
["add", () => console.log(" 添加操作")],
["delete", () => console.log(" 删除操作")]
]);
actionMap.get("add")(); // 输出 "添加操作"
牢记
“Map 是超级收纳盒:什么都能当标签(键),顺序不乱,拿取更快!”