javascript - js判断对象是否存在 - js判断空对象




如何测试空的JavaScript对象? (20)

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

    例如:

    var a = {empty:true};

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

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

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

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

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

var a = {};

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


jQuery在这种情况下有特殊的函数isEmptyObject()

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

阅读更多信息,请访问jQuery


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

lodash

_.isEmpty({}); // true

Underscore

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS(版本1)

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

Ramda

R.isEmpty({}); // true

一个简单的循环:

var is_empty = true;
for(var i in obj) {
    is_empty = false;
    break;
}

使用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对象为空的详细测试结果和测试代码


另一种方法是使用is.js (14kB)而不是jquery (32kB), lodash (50kB)或underscore (16.4kB)。 is.js被证明是上述库中最快的库,可用于确定对象是否为空。

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

显然所有这些库都不完全相同,所以如果你需要轻松操作DOM,那么jquery可能仍然是一个不错的选择,或者你需要的不仅仅是类型检查,那么lodashunderscore可能是好的。 至于is.js ,这是语法:

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

像下划线和lodash的_.isObject() ,这不仅适用于objects ,也适用于arraysstrings

在这个引擎盖下,这个库使用的是Object.getOwnPropertyNames ,类似于Object.keysObject.getOwnPropertyNames更加彻底,因为它将返回如此处所述的可枚举和不可枚举的属性。

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快一点,但仅仅因为你没有检查它是否是一个对象。


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

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

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

_.isEmpty({}) // returns true

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


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


您可以使用Underscore

_.isEmpty({}); // true

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

Boolean(Object.keys(obj)[0])

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

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

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

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

看看这个JSFiddle


我找到的最佳方式:

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

我正在使用这个。

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;
    }

正确答案是:

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

这检查:

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

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


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

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;
}

警告! 谨防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

    {}

这是我的首选解决方案:

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


你可以使用这个不使用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

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






json