在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并不是一个好主意。相反,只需深入JQuery的代码,就会得到答案:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

你最想知道的是,在使用对象之前,它是否有财产。因此,不要询问isEmpty,然后总是检查if(!isEmption(obj))之类的否定,你可以只测试对象是否为null,是否有财产

export function hasProperties(obj): boolean {
  return obj && obj.constructor === Object && Object.keys(obj).length >= 1;
}

IsEmpty Object意外地失去了它的含义,即:它是编程语义,当我们著名的Yahoo专家将定制的非枚举对象财产引入ECMA并被接受时。

[如果您不喜欢历史-请直接跳到工作代码]

对于这个问题,我看到了很多好的答案。然而,获取ECMA脚本的最新扩展并不是一条诚实的道路。我们过去为了保持网景4.x和基于网景的网页的工作和项目的活力而阻止了网络的发展,而这些网页(顺便说一句)是极其原始的向后和独特的,拒绝使用新的W3C标准和主张(在当时这是非常革命性的,对程序员来说是友好的),而现在却对我们自己的遗产残酷无情。

杀死Internet Explorer 11是完全错误的!是的,一些自“冷战”时代以来一直蛰伏在微软内部的老战士同意了这一点——理由是错误的但这并不正确!

在你的答案中使用一个新引入的方法\属性,并将其作为一个发现(“它一直存在,但我们没有注意到它”),而不是一个新发明(就其真实情况而言),有点“绿色”和有害。大约20年前,我曾经犯过这样的错误,当时我仍然无法分辨其中已经存在的东西,并将我能找到的一切作为参考,作为一个共同的工作解决方案。。。

向后兼容性很重要!

我们只是还不知道。这就是为什么我需要分享我的“百年”通用解决方案的原因,该解决方案仍然向后和向前兼容,以适应不可预见的未来。

对in运算符的攻击很多,但我认为这样做的人终于有了理智,真正开始理解和欣赏真正的动态类型语言,如JavaScript及其美丽的本质。

我的方法旨在简单和核心,出于上述原因,我不称其为“空”,因为该词的含义不再准确。是可枚举的,似乎是具有确切含义的词。

function isEnum( x ) { for( var p in x )return!0; return!1 };

一些用例:

isEnum({1:0})
true

isEnum({})
false

isEnum(null)
false

感谢阅读!

除了Thevs的回答:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

它是jquery+jquery.json

如果ECMAScript 5支持可用,则可以使用Object.keys():

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

对于ES3和更高版本,没有简单的方法可以做到这一点。您必须显式循环财产:

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

    return true;
}