map的get()和delete()方法支持任意类型键且按插入顺序保留;get()用samevaluezero算法匹配并返回undefined(不报错),delete()返回布尔值表示是否删除成功。

JavaScript 中的 Map 对象提供了一种更灵活、更可靠的键值对存储方式,相比普通对象,它支持任意类型作为键(包括对象、函数、Symbol 等),且键的顺序按插入顺序保留。要精确操作键值对,get() 和 delete() 是两个最常用也最关键的方法。
get():安全获取值,不存在时返回 undefined
get(key) 根据传入的键查找对应值。它的特点是“严格相等”匹配(使用 SameValueZero 算法,类似 ===,但 NaN 与 NaN 被视为相等)。
- 如果键存在,返回对应的值;不存在则返回
undefined(不会报错) - 即使键是对象或函数,也必须是同一个引用才能命中
- 不推荐用
if (map.get(key))判断存在性,因为值可能是false、0、''等 falsy 值
✅ 正确判断方式:
map.has(key) 先检查是否存在,再用 get() 取值;或直接用 get() 并显式比较是否为 undefined:
const map = new Map();
map.set('name', 'Alice');
map.set({id: 1}, 'user1');
console.log(map.get('name')); // 'Alice'
console.log(map.get('age')); // undefined
console.log(map.get({id: 1})); // undefined(新对象,引用不同)
console.log(map.get(map.keys().next().value)); // 'user1'(拿到原引用才可取到)
delete():精准移除指定键,返回布尔结果
delete(key) 尝试删除指定键的条目,返回 true 表示删除成功(键存在且被移除),false 表示未找到该键(不报错)。
- 只认“同一个键引用”,对对象/函数键尤其要注意引用一致性
- 删除后,该键彻底从 Map 中消失,后续
get()或has()都会返回undefined/false - 不影响其他键值对,也不改变剩余元素的遍历顺序
✅ 示例:
const map = new Map([['a', 1], ['b', 2], [{x: 1}, 'obj']]);
map.delete('a'); // true
map.delete('c'); // false(键不存在)
map.delete(['b']); // false(数组字面量不是同一引用)
map.delete({x: 1}); // false(新对象)
// 正确删除对象键需保存引用
const keyObj = {x: 1};
map.set(keyObj, 'obj');
map.delete(keyObj); // true
配合 has() 使用,提升操作可靠性
get() 和 delete() 本身不抛错,但有时你需要明确知道“键是否存在”。这时 has(key) 是最佳搭档:
- 在取值前用
has()避免误把undefined当作有效值 - 在删除前用
has()判断是否真有必要调用delete()(虽非必须,但逻辑更清晰) -
has()的匹配规则和get()/delete()完全一致,保证行为统一
✅ 实用组合写法:
if (map.has('user')) {
const user = map.get('user');
console.log('当前用户:', user);
map.delete('user'); // 确保只删存在的
}
常见陷阱提醒
使用 get() 和 delete() 时容易忽略的关键点:
-
对象/函数作键必须复用同一引用 —— 每次写
{}或function(){}都是新实例,无法匹配 -
NaN 键可以被正确识别 ——
map.set(NaN, 'nanVal'); map.get(NaN)返回'nanVal' -
原始值键注意类型一致 ——
'1'(字符串)和1(数字)是两个不同键 -
不要用 for...in 遍历 Map —— 应用
for...of、forEach或keys()/values()/entries()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











