极简三分钟ES6 - 数据结构Map

65 阅读2分钟

定义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

特性MapObject
键类型✅ 任意类型(对象、函数等)❌ 仅字符串或 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 是超级收纳盒:什么都能当标签(键),顺序不乱,拿取更快!”