判断变量是否为“真正空对象”需满足:是纯对象且无自身可枚举属性;用Object.prototype.toString.call(obj) === '[object Object]'确认类型,再用Object.keys(obj).length === 0验证属性。

判断一个变量是不是“真正空对象”,关键在于两点:它必须是纯对象(不是数组、null、undefined、Date等),且自身不含任何可枚举属性。不能只看!obj或JSON.stringify(obj) === '{}',否则容易误判。
先确认是纯对象
JavaScript里typeof null也是"object",数组、正则、日期的typeof也都是"object"。所以第一步得排除这些干扰:
- 用
Object.prototype.toString.call(obj) === '[object Object]'最稳妥,能精准识别普通字面量对象 - 避免只用
typeof obj === 'object',它对null和数组都返回true - 不要依赖
obj.constructor === Object,因为构造函数可能被改写
再检查是否真没属性
确认是纯对象后,看它有没有自己的可枚举属性:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Object.keys(obj).length === 0是首选——它只统计自身、可枚举的属性,语义清晰、兼容性好(IE9+) -
Object.getOwnPropertyNames(obj).length === 0可覆盖不可枚举属性(如obj.toString被设为不可枚举),但日常极少需要 - 避免
for...in不加hasOwnProperty检查,否则会把原型链上的属性也算进来 - 慎用
JSON.stringify(obj) === '{}':遇到undefined、function、Symbol属性时会被忽略,结果失真
组合成安全判断函数
把上面两步合起来,就是一个健壮的判断逻辑:
立即学习“Java免费学习笔记(深入)”;
function isEmptyObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]'
&& Object.keys(obj).length === 0;
}
-
isEmptyObject({})→true -
isEmptyObject(null)、isEmptyObject([])、isEmptyObject(undefined)→false -
isEmptyObject({a: undefined})→false(有属性a,哪怕值是undefined)
注意常见误区
别混淆“空对象”和“假值”:
-
if (!obj)会把0、false、''也判为空,不适用 -
obj == null只能捕获null和undefined,对{}无效 - 直接
obj === {}永远是false,因为对象比较的是引用地址

















