在 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;
}