map 的 set 和 get 实现任意类型键的精准存取:set 添加/更新键值对并返回自身支持链式调用,get 根据严格引用或值匹配获取值,不存在时返回 undefined;对象/数组作键需复用同一引用,否则无法命中。

JS 中 Map 的 set 用于存数据,get 用于取数据,两者配合实现键值对的精准存取。关键在于:键可以是任意类型(字符串、数字、布尔、对象、数组等),且严格按引用或值比对,不会自动类型转换。
set 方法:添加或更新键值对
调用 map.set(key, value),无论键是否存在,都会设置(新键则新增,已有键则覆盖)。该方法返回 Map 本身,支持链式调用。
- 支持多种键类型:字符串、数字、布尔值、对象、数组都可作键
- 同类型但不同实例的对象/数组,会被视为不同键(因为引用不同)
- 重复设同一键时,后值覆盖前值
示例:
const m = new Map();
m.set('name', '李四'); // 字符串键
m.set(42, 'answer'); // 数字键
m.set(true, 'yes'); // 布尔键
m.set({id: 1}, 'user1'); // 对象键(注意:后续必须用同一对象引用才能 get 到)
m.set(['a','b'], 100); // 数组键(同理,必须用同一数组引用才能命中)
get 方法:根据键获取对应值
调用 map.get(key),若键存在则返回对应值;不存在则返回 undefined(不是报错)。它不进行隐式类型转换,所以 m.get('1') 和 m.get(1) 是两个完全独立的查找。
- 用错引用类型键(如新创建一个对象或数组)会导致 get 返回 undefined
- 适合搭配
has()先判断再取值,避免误判
示例:
console.log(m.get('name')); // '李四'
console.log(m.get(42)); // 'answer'
console.log(m.get(false)); // undefined(布尔 false ≠ true)
console.log(m.get({id: 1})); // undefined(新对象,引用不同)
const userKey = {id: 1};
m.set(userKey, 'user1');
console.log(m.get(userKey)); // 'user1' ✅
常见陷阱与应对建议
最易出错的是把数组或对象当键却没复用同一引用。Map 不会深比较内容,只看内存地址。
- 若需用数组内容作键,可先
JSON.stringify(arr)转为字符串再 set - 若需用对象特征作键,建议用唯一字段(如
obj.id)作键,而非整个对象 - 不确定键是否存在时,优先用
map.has(key) === true判断,再调用get - 链式操作时,
set可连续写,但get不返回 Map,无法链式
实用组合技巧
结合其他 API 提升效率:
- 初始化即填值:
new Map([['a', 1], ['b', 2]]) - 安全取值并提供默认:
map.get(key) ?? 'default' - 批量更新:循环中多次调用
set,或用扩展运算符合并多个 Map - 检查后取值:
map.has(key) ? map.get(key) : fallback











