有的时候,我们会在页面初始化时,定义一个空对象。当用户进行了某项操作,就给该对象添加对应的属性。最后,当用户完成一系列操作后,将该对象的数据提交给后台,然后作相应反馈。

但是,可能在提交时,用户可能并未作任何操作。为防止这种情况,我们得先判断该对象是否为空,再给出相应的逻辑处理。

那么问题来了,如何判断一个空对象呢?据统计,有这么几种方法:

循环对象自身属性

function isEmptyObj(obj) {
for (var attr in obj) {
return false;
}

return true;
}

isEmptyObj({}); // true
isEmptyObj({name: 'user1'}); // false

这里通过遍历一个对象的属性,若存在某个属性,则为非空对象。

但是要知道,for in 只遍历可枚举属性(包括原型链上的),所以如果对象的属性是通过 Object.defineProperty 方法来添加的,可能会不准确,因为该方法添加的属性,默认是不可枚举的。

但本文所讲的给对象添加的属性,都是通过 obj.attr = value 这种形式。

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 方法返回一个由指定对象的所有自身属性的属性名组成的数组。

这些属性包含不可枚举属性,但是不包含原型链的属性。

进而,我们可以用它来判断其对应的数组长度:

function isEmptyObj(obj) {
return Object.getOwnPropertyNames(obj).length === 0
}

isEmptyObj({}); // true
isEmptyObj({name: 'user1'}); // false

Object.keys

Object.keys() 方法会返回一个指定对象的自身可枚举属性组成的数组。

这些属性包含自身属性,但不包含原型链的属性。

因此,我们也可以用它生成数组的长度来判断:

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

isEmptyObj({}); // true
isEmptyObj({name: 'user1'}); // false
`

JSON.stringify

由于一开始我们给定的是空对象 {},倘若未在该对象上添加任何属性,那么以下方法也可用于判断:

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

isEmptyObj({}); // true
isEmptyObj({name: 'user1'}); // false

$.isEmptyObject

如果你的项目引入了 jQuery,那么你可以使用它现成的方法,$.isEmptyObject:

$.isEmptyObject({}) // true
$.isEmptyObject({name: 'user1'}) // false

_.isEmpty

如果你的项目引入了 Underscore,那么你也可以使用它现成的方法,_.isEmpty:

_.isEmpty({}) // true
_.isEmpty({name: 'user1'}) // false