判断对象是否为空需检查其自身可枚举属性:最常用 object.keys(obj).length === 0,但需先校验 obj 为非空对象;严格场景应结合 object.getownpropertynames 和 object.getownpropertysymbols 检查所有自有属性。

判断一个对象是否为空对象,核心是看它是否拥有自身可枚举属性。空对象指的是没有自有(non-inherited)、可枚举(enumerable)的属性,即 {} 或通过 Object.create(null) 创建的完全干净的对象。
用 Object.keys() 判断(最常用)
该方法返回对象自身所有可枚举属性的键名数组。如果长度为 0,说明是空对象。
✅ 推荐写法:
function isEmptyObj(obj) {
return obj !== null &&
typeof obj === 'object' &&
Object.keys(obj).length === 0;
}
注意要先校验 obj 是对象且非 null,否则对 null、undefined、数组、字符串等调用会出错或返回意外结果。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 Object.getOwnPropertyNames()(兼容不可枚举属性)
如果对象可能含有 不可枚举属性(比如用 Object.defineProperty 设置的 enumerable: false 属性),而你仍想严格判定“真正无任何自有属性”,可用这个方法:
- 它返回包括不可枚举在内的所有自有属性名
- 但要注意:它不会返回 symbol 类型属性
示例:
const obj = {};
Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false });
console.log(Object.keys(obj).length); // 0 → 被判为空
console.log(Object.getOwnPropertyNames(obj).length); // 1 → 实际有属性
更严谨:同时检查 Symbol 属性和原型链
若需极致严谨(比如处理含 Symbol 键、或需要排除原型属性干扰),可组合使用:
-
Object.getOwnPropertyNames(obj)检查字符串键 -
Object.getOwnPropertySymbols(obj)检查 Symbol 键 - 确保不依赖原型上的属性(
Object.keys默认只查自有可枚举属性,已满足这点)
完整版函数:
function isEmptyObj(obj) {
if (obj == null || typeof obj !== 'object') return false;
const keys = Object.getOwnPropertyNames(obj);
const symbols = Object.getOwnPropertySymbols(obj);
return keys.length === 0 && symbols.length === 0;
}
不推荐的方式
-
JSON.stringify(obj) === '{}':对含不可枚举属性、Symbol、函数、undefined 值等会丢失信息,且性能差 -
for...in循环 +hasOwnProperty:可行但啰嗦,不如Object.keys简洁可靠 -
obj.constructor === Object:不能判断是否为空,只能粗略判断构造函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










