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

var a = {};

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


当前回答

老问题,但只是有问题。如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,就会得到答案:

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

其他回答

奇怪的是,我没有遇到一个解决方案来比较对象的值,而不是任何条目的存在(可能我在许多给定的解决方案中都没有找到它)。我想介绍一下如果一个对象的所有值都未定义,则该对象被视为空的情况:

const isObjectEmpty=obj=>Object.values(obj).every(val=>typeof val==“undefined”)console.log(isObjectEmpty({}))//trueconsole.log(isObjectEmpty({foo:undefined,bar:undefine}))//trueconsole.log(isObjectEmpty({foo:false,bar:null}))//false

示例用法

举个例子,我们有一个函数(paintOnCanvas),它从参数(x,y和size)中销毁值。如果所有这些选项都未定义,则它们将被排除在生成的选项集之外。如果不是,它们都包括在内。

function paintOnCanvas ({ brush, x, y, size }) {
  const baseOptions = { brush }
  const areaOptions = { x, y, size }
  const options = isObjectEmpty(areaOptions) ? baseOptions : { ...baseOptions, areaOptions }
  // ...
}

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

老问题,但只是有问题。如果您的唯一目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,就会得到答案:

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

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

感谢阅读!

另一种选择是使用is.js(14kB),而不是jquery(32kB)、lodash(50kB)或下划线(16.4kB)。is.js被证明是上述库中最快的库,可以用来确定对象是否为空。

http://jsperf.com/check-empty-object-using-libraries

显然,所有这些库都不完全相同,因此如果您需要轻松地操作DOM,那么jquery可能仍然是一个不错的选择,或者如果您需要的不仅仅是类型检查,那么lodash或下划线可能是不错的选择。对于is.js,语法如下:

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

与下划线和lodash的_.isObject()一样,这不仅适用于对象,也适用于数组和字符串。

该库使用的是Object.getOwnPropertyNames,它类似于Object.keys,但Object.getownPropertyName更彻底,因为它将返回此处描述的可枚举和非可枚举财产。

is.empty = function(value) {
    if(is.object(value)){
        var num = Object.getOwnPropertyNames(value).length;
        if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
            return true;
        }
        return false;
    } else {
        return value === '';
    }
};

如果您不想引入库(这是可以理解的),并且知道您只检查对象(而不是数组或字符串),那么下面的函数应该适合您的需要。

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

这只比is.js快一点,只是因为你没有检查它是否是一个对象。