面试题:JavaScript 如何判断一个对象是不是空对象?

这是一个常见的 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) === '{}';
}

❌ 缺点:

  • 会忽略 undefinedfunctionSymbol 类型的值
  • 会忽略不可枚举属性
  • DateRegExp 等对象行为异常
  • 性能较差
const obj = { fn: () => {} };
console.log(JSON.stringify(obj)); // "{}" → 误判为空

不推荐用于判断空对象


✅ 方法五:结合 typeof 的健壮版本(处理 null/undefined)

上面的方法假设传入的是对象,但实际中可能传入 nullundefined 等。

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
喜欢就支持一下吧
点赞10 分享