JavaScript 判断空对象

在 JavaScript 中,如果想要判断一个对象是否为空对象,常用的有以下 4 种方法。

  • 使用 for...in 循环和 hasOwnProperty()。
  • 使用 Object.keys().length。
  • 使用 Object.values().length。
  • 使用 Object.entries().length。

使用 for...in 循环和 hasOwnProperty()

在 JavaScript 中,我们可以使用 for...in 循环来遍历对象的属性,然后结合 hasOwnProperty() 来检查是否存在自身属性。

在遍历的过程中,如果能找到自身属性,则不是空对象。如果不能找到自身属性,则是空对象。

示例 1:

function isEmptyObject(obj) {
    // 如果能找到自身属性,则不是空对象
    for (let key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            return false;
        }
    }

    // 如果循环完成后,还没有找到自身属性,则是空对象
    return true;
}

const obj1 = {};
const obj2 = { "a": 1 };
const obj3 = new Object();

console.log(isEmptyObject(obj1));
console.log(isEmptyObject(obj2));
console.log(isEmptyObject(obj3));

运行结果如下。

true
false
true

分析:

在这个例子中,我们定义了一个名为 “isEmptyObject” 的函数来判断对象是否为空。在 isEmptyObject() 函数内部,我们使用 for...in 循环遍历对象的所有属性名。

Object.prototype.hasOwnProperty.call(obj, key) 用于安全地检查 key 是否是 obj 自身的属性。使用 call() 是为了避免对象自身重写了 hasOwnProperty() 方法。

如果找到任何自身属性,则立即返回 false,表示该对象不是空对象。如果循环结束都没有返回 false,说明没有找到自身属性,则返回 true,表示该对象是空对象。

使用 Object.keys().length

在 JavaScript 中,Object.keys() 是 Object 对象的一个静态方法,它会以 “数组的形式” 返回指定对象的可枚举属性(键)。然后我们可以根据数组的长度是否为 0,来判断对象是否为空。

语法:

Object.keys(obj).length === 0

说明:

Object.keys() 会返回一个数组,该数组的元素是对象的属性名。length 属性用于获取数组的长度。如果长度为 0,则表示对象为空(空对象的属性长度为 0)。

示例 2:

const obj1 = {};
const obj2 = { "name": "阿莫" };
const obj3 = { "age": 20, "city": "广州" };

console.log(Object.keys(obj1).length === 0);
console.log(Object.keys(obj2).length === 0);
console.log(Object.keys(obj3).length === 0);

运行结果如下。

true
false
false

分析:

Object.keys().length 这种方法简洁高效,并且只会检查对象自身的可枚举属性。

使用 Object.values().length

与 Object.keys() 类似,Object.values() 会返回一个包含对象自身所有可枚举属性值的数组。然后通过判断这个数组的长度是否为 0,我们同样也可以判断对象是否为空。

语法:

Object.values(obj).length === 0

说明:

Object.values() 会返回一个数组,数组元素是对象的属性值。length 属性用于获取数组的长度。如果长度为 0,则表达式为 true,表示对象为空。

示例 3:

const obj1 = {};
const obj2 = { "name": "阿莫" };
const obj3 = { "age": 20, "city": "广州" };

console.log(Object.values(obj1).length === 0);
console.log(Object.values(obj2).length === 0);
console.log(Object.values(obj3).length === 0);

运行结果如下。

true
false
false

分析:

与 Object.keys().length 相似,这种方式同样简洁有效。

使用 Object.entries().length

在 JavaScript 中,Object.entries() 会返回一个包含对象自身所有可枚举属性的 “[key, value]” 数组。我们通过判断这个数组的长度是否为 0,同样也可以判断对象是否为空。

语法:

Object.entries(obj).length === 0

说明:

Object.entries() 会返回一个数组,数组的每个元素都是一个 [key, value] 数组。length 属性用于获取数组的长度。如果长度为 0,则表达式为 true,表示对象为空。

示例 4:

const obj1 = {};
const obj2 = { "name": "阿莫" };
const obj3 = { "age": 20, "city": "广州" };

console.log(Object.entries(obj1).length === 0);
console.log(Object.entries(obj2).length === 0);
console.log(Object.entries(obj3).length === 0);

运行结果如下。

true
false
false

分析:

Object.entries().length === 0 也是判断空对象的简洁方法,与 Object.keys() 和 Object.values() 类似。

哪一种方法更好呢?

在实际开发中,如果想要判断普通对象是否为空(即没有自身可枚举属性),优先推荐使用 Object.keys(obj).length === 0。因为它简洁、可读性强且效率较高。此外,Object.values() 或 Object.entries() 也是不错的选择,这个取决于小伙伴们的个人偏好。

for...in 循环结合 hasOwnProperty 的方法虽然也可以,但相对更加繁琐。实际上,这种方式主要用途是用于遍历属性,而不是仅仅判断是否为空。

需要注意的是,以上方法都只检查 “可枚举” 的自身属性。如果对象可能有不可枚举的属性,或者对象是通过 Object.create(null) 创建的(没有原型链),此时可能需要采用不同的判断逻辑。

在实际使用中,为了防止传入 null 或 undefined 导致报错,我们通常会封装成下面这样一个函数:

function isEmpty(obj) {
    // 首先判断 obj 是否存在,且确实是对象
    if (!obj || typeof obj !== "object") {
        return false; 
    }
    return Object.keys(obj).length === 0;
}
给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号