在 JavaScript 中,判断一个对象是否为空对象(即没有自身可枚举属性),可以通过以下方法实现:
方法 1:使用 Object.keys()
javascript
function isEmptyObject(obj) { // 确保是普通对象(排除 null、数组和其他对象类型) return Object.prototype.toString.call(obj) === '[object Object]' && Object.keys(obj).length === 0; }
方法 2:使用 for...in
循环
javascript
function isEmptyObject(obj) { if (Object.prototype.toString.call(obj) !== '[object Object]') { return false; } for (let key in obj) { if (obj.hasOwnProperty(key)) { return false; } } return true; }
方法 3:使用 JSON.stringify()
javascript
function isEmptyObject(obj) { try { return Object.prototype.toString.call(obj) === '[object Object]' && JSON.stringify(obj) === '{}'; } catch (e) { return false; // 处理循环引用异常 } }
说明:
-
类型检查
使用Object.prototype.toString.call(obj) === '[object Object]'
确保目标是一个普通对象(如{}
或new Object()
),排除数组、null
、日期等特殊对象类型。 -
检查属性
-
Object.keys(obj).length === 0
:仅检查对象自身的可枚举属性。 -
for...in
+hasOwnProperty
:遍历对象自身属性,避免原型链干扰。 -
JSON.stringify()
:将对象转换为字符串判断,但无法处理不可枚举属性和循环引用。
-
-
边界情况
-
若对象只有 Symbol 属性或不可枚举属性,上述方法可能返回
true
(需用Reflect.ownKeys()
检测所有属性)。 -
非对象类型(如
null
、数字)直接返回false
。
-
使用示例:
javascript
isEmptyObject({}); // true isEmptyObject({ a: 1 }); // false isEmptyObject([]); // false isEmptyObject(null); // false isEmptyObject(Object.create(null)); // true isEmptyObject(new Date()); // false
根据实际需求选择合适的方法,通常推荐 方法 1 或 方法 2。