map 的 size 是内置只读属性,准确即时反映键值对数量;object 无原生键数统计,需手动遍历且易出错,reflect.ownkeys(obj).length 最接近 map 语义。

Map 的 size 是内置只读属性,直接返回键值对数量;Object 没有原生键数统计,需手动遍历或转换处理。
Map 的 size 属性:准确、即时、无需计算
Map 实例自带 size 属性,类型为 number,反映当前存储的键值对总数。每次调用 set()、delete() 或 clear() 后自动更新,无需额外逻辑。
- 支持任意类型键(包括对象、函数、Symbol),计数不受键类型影响
- 即使键是
{}或function(){},也会被独立计为一个有效键 - 不存在“原型链污染”问题——只统计自身键,不包含继承属性
Object 键数统计:必须手动实现,且易出错
普通对象没有 length 或 size 属性,统计自有可枚举键需依赖 Object.keys()、Object.getOwnPropertyNames() 或 for...in,但三者行为不同:
-
Object.keys(obj).length:仅统计**自有 + 可枚举**字符串键(最常用,但忽略 Symbol 键) -
Object.getOwnPropertyNames(obj).length:统计**自有**字符串键(含不可枚举的,如Object.defineProperty设置的) -
Reflect.ownKeys(obj).length:统计**所有自有键**(含字符串和 Symbol)——最接近 Map 的语义 -
for...in:会遍历原型链上的可枚举属性,必须配合hasOwnProperty过滤,否则结果偏大
实际使用建议:按场景选结构
若核心需求是“动态维护键值对并频繁查数量”,优先用 Map;若只是静态配置或需 JSON 序列化,则 Object 更自然。
- 需要迭代顺序保证(插入顺序)→ 选 Map(Object 在 ES2015+ 也保证字符串键插入序,但 Symbol 键顺序不统一)
- 键是动态生成的对象或函数 → 必须用 Map(Object 键会被自动转为字符串
"[object Object]") - 要序列化为 JSON → 用 Object(Map 需手动转成数组或 Object 才能
JSON.stringify) - 仅需轻量键值存储且键全为字符串 → Object +
Object.keys(obj).length足够简洁
一个小陷阱:Object 的空对象不一定“空”
看似空的 {},可能因原型链拥有可枚举属性(比如给 Object.prototype 添加了属性),导致 for...in 统计异常。而 Object.keys({}) 和 Reflect.ownKeys({}) 始终返回 [],更可靠。
Map 则完全隔离,new Map().size 永远是 0,无隐式继承干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











