测验

如何可靠地确定一个对象是否为空?

主题
JavaScript

TL;DR

要可靠地确定一个对象是否为空,您可以使用 Object.keys() 来检查该对象是否具有任何可枚举的属性。如果 Object.keys() 返回的数组的长度为零,则该对象为空。

const isEmpty = (obj) => Object.keys(obj).length === 0;
const obj = {};
console.log(isEmpty(obj)); // true

如何可靠地确定一个对象是否为空?

使用 Object.keys()

检查对象是否为空的最常见和可靠的方法是使用 Object.keys()。此方法返回一个包含对象自身可枚举属性名称的数组。如果此数组的长度为零,则该对象为空。

const isEmpty = (obj) => Object.keys(obj).length === 0;
const obj1 = {};
const obj2 = { key: 'value' };
console.log(isEmpty(obj1)); // true
console.log(isEmpty(obj2)); // false

使用 Object.entries()

另一种方法是使用 Object.entries(),它返回一个包含对象自身可枚举属性 [key, value] 对的数组。如果此数组的长度为零,则该对象为空。

const isEmpty = (obj) => Object.entries(obj).length === 0;
const obj1 = {};
const obj2 = { key: 'value' };
console.log(isEmpty(obj1)); // true
console.log(isEmpty(obj2)); // false

使用 Object.values()

同样,您可以使用 Object.values(),它返回一个包含对象自身可枚举属性值的数组。如果此数组的长度为零,则该对象为空。

const isEmpty = (obj) => Object.values(obj).length === 0;
const obj1 = {};
const obj2 = { key: 'value' };
console.log(isEmpty(obj1)); // true
console.log(isEmpty(obj2)); // false

使用 for...in 循环

您还可以使用 for...in 循环。由于它会遍历对象自身及其原型链上的可枚举属性,因此应使用 Object.hasOwn() 只统计对象自身的属性。

const isEmpty = (obj) => {
for (const key in obj) {
if (Object.hasOwn(obj, key)) {
return false;
}
}
return true;
};
const obj1 = {};
const obj2 = { key: 'value' };
const childObj = Object.create(obj2); // Inherit from obj2
console.log(isEmpty(obj1)); // true
console.log(isEmpty(obj2)); // false
console.log(isEmpty(childObj)); // true (has no own properties)
console.log(childObj.key); // Output: 'value' (still has the inherited property)

边缘情况

  • 原型属性:上述方法仅检查对象自身的属性,而不是从其原型继承的属性。
  • 不可枚举属性:这些方法不考虑不可枚举属性。
  • 自有属性检查:直接调用 obj.hasOwnProperty(key) 在无原型对象或覆盖了 hasOwnProperty 的对象上可能失败。优先使用 Object.hasOwn(obj, key)Object.prototype.hasOwnProperty.call(obj, key)

延伸阅读

在GitHub上编辑