判断对象是否为空

JavaScript 中判断空对象的几种方法

问题

如何判断一个对象是否为空对象(即 {})?

解答

方法一:Object.keys()

function isEmpty(obj) {
  return Object.keys(obj).length === 0;
}

// 测试
console.log(isEmpty({}));           // true
console.log(isEmpty({ a: 1 }));     // false

方法二:JSON.stringify()

function isEmpty(obj) {
  return JSON.stringify(obj) === '{}';
}

// 测试
console.log(isEmpty({}));           // true
console.log(isEmpty({ a: 1 }));     // false

方法三:for…in 循环

function isEmpty(obj) {
  for (let key in obj) {
    // 确保是自身属性,不是原型链上的
    if (obj.hasOwnProperty(key)) {
      return false;
    }
  }
  return true;
}

// 测试
console.log(isEmpty({}));           // true
console.log(isEmpty({ a: 1 }));     // false

方法四:Object.getOwnPropertyNames()

function isEmpty(obj) {
  // 可以获取不可枚举的属性
  return Object.getOwnPropertyNames(obj).length === 0;
}

// 测试
console.log(isEmpty({}));           // true
console.log(isEmpty({ a: 1 }));     // false

完整的健壮版本

function isEmpty(obj) {
  // 排除 null 和 undefined
  if (obj == null) return true;
  
  // 排除非对象类型
  if (typeof obj !== 'object') return true;
  
  // 判断是否有自身属性
  return Object.keys(obj).length === 0;
}

// 测试
console.log(isEmpty({}));           // true
console.log(isEmpty({ a: 1 }));     // false
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true
console.log(isEmpty([]));           // true(数组也是对象)

关键点

  • Object.keys() 是最常用的方法,返回可枚举属性数组
  • JSON.stringify() 简单但性能较差,且无法处理循环引用
  • for...in 会遍历原型链,需配合 hasOwnProperty 使用
  • Object.getOwnPropertyNames() 可获取不可枚举属性
  • 实际使用时需考虑 nullundefined 等边界情况