如何测试空的JavaScript对象?

falmp 2730 javascript

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

var a = {};

我怎样才能检查是否是这种情况?

Adam Zerner.. 4767

ECMA 7+:

// because Object.entries(new Date()).length === 0;
// we have to do some additional check
Object.entries(obj).length === 0 && obj.constructor === Object

ECMA 5+:

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

ECMA 5之前:

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

  return JSON.stringify(obj) === JSON.stringify({});
}

jQuery:

jQuery.isEmptyObject({}); // true

洛达什:

_.isEmpty({}); // true

下划线:

_.isEmpty({}); // true

霍克

Hoek.deepEqual({}, {}); // true

ExtJS的

Ext.Object.isEmpty({}); // true

AngularJS(版本1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

  • 这是jQuery和下划线之间的性能测试https://jsperf.com/isempty-vs-isemptyobject/6 (19认同)
  • `Object.keys(new Date()).length === 0`; 所以这个答案可能会产生误导. (14认同)
  • `Object.keys()`不检查不可枚举的属性或符号.你需要使用`Object.getOwnPropertyNames()`和`Object.getOwnPropertySymbols()`.另外,`Object.getPrototypeOf()`是获取对象原型的正确方法.`obj.constructor`可以很容易伪造.示例:`function Foo(){} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true`. (7认同)
  • 你可以利用这个事实来代替字母串行:`(new Date()).constructor === Date`,或者相反,`({}).constructor === Object`. (6认同)
  • angular.equals({},{}); (2认同)

Christoph.. 824

没有简单的方法可以做到这一点.您必须显式遍历属性:

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

    return true;
}

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

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

  • 这工作正常,或更简单:function isEmpty(object){for(var i in object){return true; } return false; } (56认同)
  • 在这个功能中,不应该反转真假吗? (36认同)
  • 您不应该使用第二个示例,因为它是O(n)时间复杂度和O(n)空间复杂度,而第一个是O(1). (27认同)
  • @namtax:不 - 函数名为`isEmpty()`,所以如果它有一个属性它应该返回`false` (25认同)
  • 空对象将扩展默认的Object类,但如果修改了对象原型,则简化的函数将无法考虑:Object.prototype.a ='hi'; var obj = {}; 警报(obj.a); //输出"hi"isEmpty(obj)//返回false (6认同)
  • @NicholasKreidberg你的函数应该被称为isNOTEmpty.AngusC我不知道你在说什么.BashirMagomedov你不能省略那个测试,因为venimus正确指出了什么.克里斯托夫说得对. (6认同)
  • @Brian我准备了一个快速的jsperf测试,将Object.keys与for-in方法进行比较.似乎表明for-in更快但仍然大致为O(n).http://jsperf.com/empty-object-test (3认同)
  • `Object.keys(obj).length`对我来说是最好的做法. (2认同)

Erik Töyrä S.. 558

对于那些有相同问题但使用jQuery的人,可以使用jQuery.isEmptyObject.

  • 如果问题根本不是关于jQuery,为什么你发布包括jQuery的答案? (157认同)
  • 这些评论中典型的JS势利.每个人都知道网络上的大部分JavaScript都是用jQuery编写的,所以如果它已经有了一个用于测试对象的内置方法,那么为jQuery提供解决方案是完全可以接受的.成千上万寻求帮助的开发人员可能会发现这个答案很有帮助.没有人说这是唯一的方法.我注意到没有人对那个发布使用`underscore.js`的解决方案的人表现出所有的精英主义者...... (48认同)
  • 我知道这是一个旧的评论,但我想知道你的问题@ MFD3000,因为文件说:如果对象为空(如名称所示),则返回true (45认同)
  • 嘿!我只花了几个小时调试IE 8问题才发现导致问题的是jQuery.isEmptyObject.如果对象为空,则返回true. (41认同)
  • 包括jQuery这样的基本任务并不是我所说的正确答案.确实,现在jQuery几乎无处不在,但我们仍然不应该忘记它是围绕一种非常有能力的语言本身构建的. (19认同)
  • @Tristan jQuery几乎不是一些随机库,是吗?它是有史以来最受欢迎的JS库,数百万个站点依赖它.我没有看到发布这两个答案的问题,因此有一个纯JS解决方案和一个jQuery解决方案,所以正在jQuery网站上工作的开发人员知道一个快速的内置函数.显然没有人建议您在您的网站上加载整个jQuery库,其唯一目的是使用一个小实用程序功能......显然,对于已经使用jQuery的人来说,这显然是一个解决方案... (10认同)
  • 如果您(或任何插件)修改了Object.prototype,这将不起作用. (3认同)
  • 请注意,当您向它提供一个空的jQuery对象时,jQuery.isEmptyObject会返回**false**(如[其API页面](http://api.jquery.com/jQuery.isEmptyObject/)中所述).它仅适用于常规JavaScript对象. (3认同)
  • @eru他是通灵者,知道他的答案会获得最多的选票.他怎么那样做的? (2认同)
  • @ MFD3000-大声笑... isEmptyObject如果对象为空,则返回true?那是一个问题,因为....?该方法说它确实做到了 (2认同)

小智.. 249

这是我的首选解决方案:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

  • `Object.keys(new Date()).length === 0`; 所以这个答案可能会产生误导. (7认同)
  • @Jero Franzani:不,不 (3认同)

Baggz.. 197

您可以使用Underscore.js.

_.isEmpty({}); // true

  • 或者你可以使用lodash是空的(http://lodash.com/docs#isEmpty),但是与使用jQuery解决方案有什么不同 - 你仍然需要安装一个额外的库.我认为一个vanilla javascript解决方案是意图. (19认同)
  • 如果你想在Node.js的后端使用JS,那就不一样了.很少有人会想在后端使用jQuery(一个主要用于DOM操作的前端库). (8认同)
  • Underscore正在被lodash取代.改用它. (4认同)
  • @tfmontague下划线在节点应用程序中非常常见,几乎与jQ在客户端无处不在.我已经有下划线要求,但没有意识到它有这个功能 (2认同)
  • 请注意Date类型,isEmpty总是为Date返回true,请参阅https://github.com/jashkenas/underscore/issues/445 (2认同)

es cologne.. 112

if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

http://bencollier.net/2011/04/javascript-is-an-object-empty/

  • 这在IE8及以下版本中不起作用. (5认同)
  • 这包括不可枚举的属性,以备您关注. (5认同)
  • `Object.getOwnPropertyNames(new Date()).length === 0`; 所以这个答案可能会产生误导. (4认同)

Ateszki.. 78

如何使用JSON.stringify?它几乎适用于所有现代浏览器.

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

  • 这很慢,速度对于这种实用程序很重要.这里的快速性能测试:http://jsperf.com/empty-object-test (25认同)
  • return(JSON.stringify(obj)=='{}') (22认同)

Jonathan Pet.. 59

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

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

  • 这仅在某些其他进程未向您的基础对象添加原型时才有用.为了使其真正可行,您需要测试obj.hasOwnProperty(名称) (5认同)

Anish Nair.. 56

我刚遇到类似的情况.我不想使用JQuery,并希望使用纯Javascript来做到这一点.

而我所做的是,使用了以下条件,它对我有用.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

如果不相等,请使用: JSON.stringify(obj) !== '{}'

看看这个JSFiddle

  • 如果对象不是空的(它也适用于它们). (8认同)
  • 具有循环引用的对象将失败,因为JSON.stringify特别为它们抛出异常. (4认同)

download.. 35

如果您使用的是较新的浏览器,则有一种简单的方法. Object.keys(obj).length == 0

  • @scravy对象是Object类.Object有一个名为'keys'的静态方法,它接受一个对象作为参数.此方法返回字符串数组,其中字符串是属性名称.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys (9认同)
  • 这是ECMAScript 5.1中的[标准方法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) (2认同)

小智.. 29

您可以检查对象键的计数:

if (Object.keys(a).length > 0) {
    // not empty
}

  • 为什么要为已经给出的答案添加评论并给出更糟糕的答案?/sf/ask/17360801/这是**4月**的第一个答案 (8认同)

davidhadas.. 26

使用Object.keys(obj).length(如上面针对ECMA 5+所建议的)对于空对象来说慢10倍!保持旧学校(for ... in)选项.

在Node,Chrom,Firefox和IE 9下测试,很明显,对于大多数用例:

  • (for ... in ...)是最快的选择!
  • Object.keys(obj).length对于空对象来说慢10倍
  • JSON.stringify(obj).length总是最慢的(并不令人惊讶)
  • Object.getOwnPropertyNames(obj).length比Object.keys(obj)更长.在某些系统上,.length可能要长得多.

明智的底线表现,使用:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

要么

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

查看Is对象为空的详细测试结果和测试代码


Thevs.. 24

  1. 只是一个解决方法.如果没有数据,您的服务器可以生成一些特殊属性吗?

    例如:

    var a = {empty:true};
    

    然后,您可以在AJAX回调代码中轻松检查它.

  2. 检查它的另一种方法:

    if (a.toSource() === "({})")  // then 'a' is empty
    

编辑:如果您使用任何JSON库(fe JSON.js),那么您可以尝试JSON.encode()函数并针对空值字符串测试结果.

  • `toSource()`是非标准的,不适用于IE或Opera(以及我未检查的其他浏览器) (6认同)
  • @Thevs:也许你有一份ECMA-262当前版本的副本,但我的第15.2.4节没有列出`toSource`属性; 根据MDC,它是在JS1.3(即Netscape Navigator 4.06)中引入的,但它不是在ECMA-262,第3版! (3认同)
  • @Thevs:嗯,至少有两家重要的浏览器供应商没有实现它,所以它几乎不是事实上的标准,因为它不是ECMA-262,它也不是真正的...... (3认同)
  • @Thevs的开销更大,即使它*可能*(我不确定它是在任何情况下)在同一数量级.然而,这个答案涉及一旦找到不同的属性就返回错误,这使得故事全部不同...... (3认同)
  • 即使它确实有效,`toSource()`也是一种可怕的方法(就像`JSON.encode()`).它需要构建一个表示整个对象的字符串,以检查它是否为空.将事物转换为字符串会产生开销,但是如果你的对象拥有一百万个属性,它将需要转换一百万个东西,而实际上只看一个就会让你知道它不是空的. (2认同)

Slava Fomin .. 23

我已经创建了一个完整的函数来确定对象是否为空.

它使用Object.keysECMAScript中5(ES5)功能,如果可能的话,以达到最佳性能(见兼容性表)并回退给老式引擎(浏览器)最兼容的方法.

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

这是此代码的要点.

这是JSFiddle的演示和简单的测试.

我希望它能帮助别人.干杯!

  • 这对于`null`对象失败了. (3认同)

kiranvj.. 17

我正在使用这个.

function isObjectEmpty(object)
{
  var isEmpty = true;
  for(keys in object)
  {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

例如:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

从这里

更新

要么

你可以使用isEmptyObject的jQuery实现

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


GibboK.. 14

以下示例显示如何测试JavaScript对象是否为空,如果为空,则表示没有自己的属性.

该脚本适用于ES6.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true


小智.. 12

function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

  • 那个报告也是如此,例如,当一个JavaScript库通过原型链扩展`Object`和一个方法时,因为它是可枚举的,并且`for in`语句循环遍历可枚举的属性. (4认同)

Vikrant.. 12

根据Object.entries()上的ES2017规范,使用任何现代浏览器检查都很简单 -

Object.entries({}).length === 0


小智.. 11

jQuery isEmptyObject()对于这种情况有特殊功能:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

阅读更多信息,请访问http://api.jquery.com/jQuery.isEmptyObject/


ahmadalibalo.. 11

在幕后,所有库中的所有空检查方法都使用对象键检查逻辑。使它易于理解是一种奇怪的方式,您可以将其放入方法中,在此进行描述。

for(key in obj){
   //your work here.
 break;
}

ES5中得到了发展,现在简单地说,您可以使用Object.Keys将对象作为参数的方法来检查对象的密钥长度:

if(Object.keys(obj).length > 0){
 //do your work here
}

或者,如果您正在使用Lodash(必须),则使用。

 _.isEmpty(obj) //==true or false


Tudor Morar.. 11

我会去检查它是否至少有一把钥匙.这足以告诉我它不是空的.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])


iman.. 10


你可以使用这个不使用jQuery或其他库的简单代码

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

JSON类及其函数(parsestringify)非常有用,但是IE7存在一些问题,您可以使用这个简单的代码http://www.json.org/js.html修复它.

其他简单方法(最简单的方法):
您可以使用这种方式而不使用jQueryJSON对象.

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted


小智.. 10

我找到的最佳方式:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

效劳于:

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false

  • 我会说0不是空的,因为它实际上是一个数字.其他一切看起来不错,但修复很容易.在第一个if语句中添加此项.`if(!obj && obj!== 0)`. (3认同)

NiKo.. 9

我的看法:

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

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

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


jichi.. 9

如果jQuery和Web浏览器不可用,则underscore.js中还有一个isEmpty函数.

_.isEmpty({}) // returns true

此外,它不会将输入参数视为对象.对于列表或字符串或未定义,它也将转换正确的答案.


Jesse.. 7

正确答案是:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

这检查:

  • 该对象没有自己的属性(无论可枚举性如何).
  • 该对象没有自己的属性符号.
  • 对象的原型正是如此Object.prototype.

换句话说,该对象与创建的对象无法区分{}.


Ekim.. 6

警告!谨防JSON的限制.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

显示器

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}


starikovs.. 5

除了Thevs答案:

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

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

这是jquery + jquery.json

  • 如果您的页面加载了jQuery,则使用$ .isEmptyObject(),不要浪费时间进行非显而易见的转换。 (2认同)

mikemaccana.. 5

Sugar.JS为此提供了扩展对象。代码简洁明了:

制作一个扩展对象:

a = Object.extended({})

检查它的大小:

a.size()


归档时间:

查看次数:

1949580 次

最近记录:

10 月,1 周 前