在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:

var a = {};

我该如何检查是否是这种情况?


当前回答

我知道这并不能100%回答你的问题,但我以前也遇到过类似的问题,下面是我如何解决这些问题:

我有一个可能返回空对象的API。因为我知道从API中需要哪些字段,所以我只检查是否存在任何必需的字段。

例如:

API返回{}或{agentID:“1234”(必需),地址:“1234通道”(可选),…}。在我的调用函数中,我只检查

if(response.data && response.data.agentID) { 
  do something with my agentID 
} else { 
  is empty response
}

这样,我就不需要使用那些昂贵的方法来检查对象是否为空。如果对象没有agentID字段,则调用函数的对象将为空。

其他回答

从jQuery 1.4开始,isEmptyObject()方法检查对象本身的财产和从原型继承的财产(因为它不使用hasOwnProperty)。参数应该始终是一个普通的JavaScript对象,因为其他类型的对象(DOM元素、原始字符串/数字、宿主对象)可能不会在浏览器中提供一致的结果。要确定对象是否为纯JavaScript对象,请使用$.isPlainObject()。

jQuery.isPlainObject({}) // true

jQuery.isPlainObject( "test" ) // false

Jquery api

我的看法:

函数isEmpty(obj){return Object.keys(obj).length==0;}变量a={a: 1中,b: 2个}变量b={}console.log(isEmpty(a));//假的console.log(isEmpty(b));//真的

只是,我认为目前并不是所有浏览器都实现Object.keys()。

1.使用Object.keys

Object.keys将返回一个数组,其中包含对象的属性名。如果数组的长度为0,那么我们知道对象是空的。

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

我们还可以使用Object.values和Object.entries检查这一点。这通常是确定对象是否为空的最简单方法。

2.使用for…in循环对象财产

for…in语句将循环通过对象的可枚举属性。

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

在上面的代码中,我们将循环遍历对象财产,如果一个对象至少有一个属性,那么它将进入循环并返回false。如果对象没有任何财产,那么它将返回true。

#3.使用JSON.stringify如果我们将对象字符串化,结果只是一个左括号和右括号,那么我们就知道对象是空的。

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

4.使用jQuery

jQuery.isEmptyObject(obj); 

5.使用Undercore和Lodash

_.isEmpty(obj);

资源

我能找到的最佳单线解决方案(已更新):

isEmpty=obj=>!Object.values(obj).filter(e=>类型e!=='undefined').length;console.log(isEmpty({}))//trueconsole.log(isEmpty({a:undefined,b:undefine}))//trueconsole.log(isEmpty({a:undefined,b:void 1024,c:void 0}))//trueconsole.log(isEmpty({a:[undefined,undefined]}))//falseconsole.log(isEmpty({a:1}))//falseconsole.log(isEmpty({a:“”}))//falseconsole.log(isEmpty({a:null,b:undefined}))//false

如果您使用更新的浏览器,有一个简单的方法。对象.keys(obj).length==0