object会隐式将数字键转为字符串,map则保留键的原始类型;object中obj[1]与obj["1"]等价,map中map.get(1)与map.get("1")指向不同值。

关键看键是否被隐式转成字符串——Object 会,Map 不会。
数字键在 Object 中全变成字符串
无论你写 obj[1] 还是 obj["1"],JavaScript 都会把数字 1 转成字符串 "1" 再存。它们指向同一个位置:
-
const obj = { 1: "a" };→ 实际是{ "1": "a" } -
obj[1] === obj["1"]返回 true - 用
Object.keys(obj)拿到的全是字符串:["1"]
Map 保留数字键的原始类型
Map 把 1 和 "1" 当作两个完全不同的键,不做强制转换:
const map = new Map(); map.set(1, "num"); map.set("1", "str");-
map.get(1)得到 "num",map.get("1")得到 "str" -
map.size是 2,说明两个键都独立存在
验证方式:用 typeof + get 对比
最直接的识别方法是同时塞入数字和同值字符串,再分别取值:
- 对 Object:
obj[1] === obj["1"]必为 true - 对 Map:
map.get(1) === map.get("1")通常为 false(除非你手动设了相同值) - 再检查
typeof键本身:map.keys()迭代出来的键,typeof可能是"number"或"string",而 Object 的所有键typeof都是"string"
容易踩坑的场景
比如从接口拿到 ID 是数字,又混用字符串 ID 做缓存时:
- 用 Object:
cache[123]和cache["123"]无法区分,可能覆盖或误读 - 用 Map:
cache.set(123, data)和cache.set("123", other)安全共存 - 从后端返回的 JSON 解析后,ID 默认是数字;前端路由参数常是字符串——这种混合类型场景,Map 更可靠










