这是一个常见的 JavaScript 面试题,考察对对象属性遍历和 Object
API 的掌握。判断一个对象是否为空对象(即不包含任何自身可枚举属性),有多种方法。
✅ 方法一:Object.keys()
(推荐,简洁)
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
// 示例
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false
✅ 优点:
- 简洁、易读
- 只检查自身可枚举属性
- ES5+ 兼容性好
✅ 方法二:for...in
循环 + hasOwnProperty
(传统方式)
function isEmpty(obj) {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
return false;
}
}
return true;
}
✅ 说明:
for...in
会遍历所有可枚举属性(包括原型链)hasOwnProperty
确保只检查对象自身的属性- 如果没有自身属性,循环不会执行,返回
true
⚠️ 注意:
如果不加 hasOwnProperty
,原型上的属性会导致误判:
Object.prototype.extra = 'bad';
isEmpty({}); // ❌ 错误地返回 false(如果没有 hasOwnProperty)
✅ 方法三:Object.getOwnPropertyNames()
(包含不可枚举属性)
function isEmpty(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
✅ 特点:
- 检查所有自身属性(包括不可枚举属性,如
Object.defineProperty
定义的) - 比
Object.keys()
更严格
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 1,
enumerable: false
});
console.log(Object.keys(obj).length); // 0 → isEmpty() = true
console.log(Object.getOwnPropertyNames(obj).length); // 1 → isEmpty() = false
通常我们只关心可枚举属性,所以
Object.keys
更常用。
✅ 方法四:JSON.stringify()
(不推荐,有坑)
function isEmpty(obj) {
return JSON.stringify(obj) === '{}';
}
❌ 缺点:
- 会忽略
undefined
、function
、Symbol
类型的值 - 会忽略不可枚举属性
- 对
Date
、RegExp
等对象行为异常 - 性能较差
const obj = { fn: () => {} };
console.log(JSON.stringify(obj)); // "{}" → 误判为空
❌ 不推荐用于判断空对象
✅ 方法五:结合 typeof
的健壮版本(处理 null/undefined)
上面的方法假设传入的是对象,但实际中可能传入 null
、undefined
等。
function isEmpty(obj) {
// 先确保是对象且不为 null
if (typeof obj !== 'object' || obj === null) {
return false; // 或 true,根据业务需求
}
return Object.keys(obj).length === 0;
}
// 更严格的判断:必须是普通对象
function isEmptyPlainObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]' &&
Object.keys(obj).length === 0;
}
✅ 总结(面试回答模板)
判断空对象最常用且推荐的方法是
Object.keys(obj).length === 0
,它简洁、安全,只检查对象自身的可枚举属性。其他方法:
for...in
+hasOwnProperty
:传统方式,兼容性好;Object.getOwnPropertyNames()
:包含不可枚举属性,更严格;- 避免使用
JSON.stringify()
,因为它有诸多限制和陷阱。实际使用中,建议先判断参数是否为有效对象,避免传入
null
或非对象类型导致错误。📌 一句话总结:
Object.keys(obj).length === 0
是最佳实践。
THE END