map通过哈希表存储任意类型键的键值对,保留插入顺序,使用samevaluezero算法判断键相等(nan等于nan、+0等于-0),支持对象/函数/symbol等作键,且无原型污染风险。

Map 在 JavaScript 中通过内部哈希表机制存储键值对,支持任意类型的键(包括对象、函数、Symbol 甚至 null),且保留插入顺序。
键的唯一性与相等判断
Map 使用“SameValueZero”算法比较键:NaN 等于 NaN,+0 等于 -0,其余遵循严格相等(===),但 不进行类型转换。这意味着:
-
map.set("1", "a")和map.set(1, "b")是两个不同的键(字符串 "1" ≠ 数字 1) -
map.set({}, "obj1")和map.set({}, "obj2")是两个键(两个空对象内存地址不同) -
map.set(NaN, "nan1")再次set(NaN, "nan2")会覆盖,因为 NaN 被视为同一键
底层存储逻辑简述
Map 不暴露内部结构,但行为上可理解为维护了一个有序的键值对列表(类似数组),每次 set() 将新条目追加到末尾(若键已存在则更新值,位置不变)。遍历时(如 for...of、keys()、values())严格按插入顺序返回。
与普通对象对比的关键差异
普通对象只能用字符串或 Symbol 作键,且原型链上的属性可能干扰;Map 则无此限制:
- 对象键:
const key = {id: 1}; map.set(key, "user")—— 安全有效 - 动态键名:
map.set(someFunction, "handler")—— 函数可直接作键 - 避免原型污染:
map.set("toString", "custom")不会覆盖内置方法
常用操作示例
创建与增删查改都很直观:
-
const m = new Map()—— 创建空 Map -
m.set(key, value)—— 插入或更新 -
m.get(key)—— 返回对应值,键不存在时返回 undefined -
m.has(key)—— 返回布尔值,推荐用于存在性判断(比get() !== undefined更准确) -
m.delete(key)—— 删除并返回是否成功 -
m.size—— 获取当前键值对数量(对象没有等效的原生属性)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











