判断变量是否为空对象需先确认其为非null的对象类型且无可枚举自有属性,常用Object.keys(obj).length === 0配合类型检查,注意排除数组、null等边界值。

判断一个变量是否为空对象,关键在于确认它是一个对象类型,且内部没有可枚举的自有属性。
基础判断:类型 + 属性数量
最常用、兼容性好的方式是结合 typeof 和 Object.keys():
- 先用
typeof obj === 'object'排除非对象类型(注意null也返回'object',需单独排除) - 再用
Object.keys(obj).length === 0检查是否有可枚举的自有属性
完整写法:
function isEmptyObject(obj) {return obj !== null &&
typeof obj === 'object' &&
Object.keys(obj).length === 0;
}
注意原型链和不可枚举属性
Object.keys() 只返回**可枚举的自有属性**,所以以下情况仍会被判为“空”:
立即学习“Java免费学习笔记(深入)”;
- 对象继承了原型上的属性(如
{}继承自Object.prototype) - 对象有
Object.defineProperty定义的enumerable: false属性
如果业务需要严格检查“完全无任何自有属性”(包括不可枚举的),可用 Object.getOwnPropertyNames() 替代:
区分数组、null、undefined 等边界值
空对象不等于空数组、null 或 undefined。常见误判点:
-
[]是数组,typeof [] === 'object',但Object.keys([]).length === 0也为true→ 需额外用Array.isArray(obj)排除 -
null必须显式排除,否则会进入对象分支 -
undefined、0、false、''等都应被识别为非对象
增强版示例(排除数组等):
function isEmptyObject(obj) {if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) return false;
return Object.keys(obj).length === 0;
}
ES6+ 更简洁的写法(可选)
利用 Object.entries()(返回键值对数组)语义更清晰:
效果与 Object.keys() 一致,但更直观体现“无内容”。需注意 IE 不支持,如需兼容请避免。


















