最快最直观判断对象是否为空的方法是object.keys(obj).length === 0,它仅检查自有可枚举属性,而object.hasown用于检测特定自有属性,二者用途不同,不可混用。

直接用 Object.keys(obj).length === 0 最快也最直观,但要注意它只判断“自有可枚举属性”,而 Object.hasOwn 本身不用于“检查是否为空”,它是用来安全判断某个属性是否为对象**自有属性**的工具——两者用途不同,不能混用。
快速判断对象是否为空的推荐方式
多数场景下,“空对象”指不含**自有可枚举属性**(即 for...in 遍历时不会出现的属性不算)。这时最常用、性能好且兼容性佳的方式是:
-
Object.keys(obj).length === 0—— 简洁、语义清晰、现代环境支持良好(ES5+) -
JSON.stringify(obj) === "{}"—— 不推荐,会忽略函数、undefined、Symbol 键,还慢 -
!Object.keys(obj).length—— 和第一种等价,更简短,但可读性略低
Object.hasOwn 的真实用途:安全检测自有属性
Object.hasOwn(obj, key) 是 Object.prototype.hasOwnProperty.call(obj, key) 的现代替代,专用于判断 key 是否为 obj 的**自有属性**(不包括原型链上的属性),和“对象是否为空”没有直接关系。例如:
-
Object.hasOwn({}, 'toString') → false(toString 来自原型) Object.hasOwn({a: 1}, 'a') → true-
Object.hasOwn(Object.create({b: 2}), 'b') → false(b 在原型上)
它不能代替 Object.keys 判断空对象,因为你要检查的是“有没有任何自有属性”,而不是“某一个特定属性是否存在”。
如果真想用 hasOwn 检查空对象?可以但没必要
理论上你可以遍历所有可能的键(比如用 Object.getOwnPropertyNames + Object.getOwnPropertySymbols),再逐个用 Object.hasOwn 判断——但这既繁琐又低效,而且会把不可枚举属性也算进去,反而偏离了通常说的“空对象”含义(默认指无自有可枚举属性)。
- 要严格检查“完全无自有属性(含不可枚举、Symbol)”,用:
!Object.getOwnPropertyNames(obj).length && !Object.getOwnPropertySymbols(obj).length - 但绝大多数业务场景,
Object.keys(obj).length === 0已足够准确且高效
注意边界情况
以下值不是对象,调用 Object.keys 会隐式转为对象,结果可能不符合直觉:
-
Object.keys(null)或Object.keys(undefined)→ 抛错 -
Object.keys(123)→[](数字被包装,但无自有可枚举属性) - 稳妥写法:
obj != null && typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0











