我如何testing一个空的JavaScript对象?

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

var a = {}; 

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

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 

下划线 :

 _.isEmpty({}); // true 

霍克

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

ExtJS的

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

AngularJS(版本1)

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

Ramda

 R.isEmpty({}); // true 

有没有简单的方法来做到这一点。 你必须显式地遍历这些属性:

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

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

你可以使用Underscore.js 。

 _.isEmpty({}); // true 

这是我的首选解决scheme:

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

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

如何使用JSON.stringify? 它在所有现代浏览器中几乎都可用。

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

老问题,但只是有问题。 包括JQuery不是一个好主意,如果你唯一的目的是检查对象是否是空的。 相反,只要深入JQuery的代码 ,你会得到答案:

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

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

而我所做的是,使用了以下条件,并为我工作。

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

对于不等于,使用这个: JSON.stringify(obj) !== '{}'

看看这个JSFiddle

我创build了一个完整的函数来确定对象是否为空。

如果可能的话,它使用ECMAScript 5 (ES5)function中的Object.keys ,以实现最佳性能(请参阅兼容性表 ),并采用适用于旧版引擎(浏览器)的最兼容方法。

 /** * 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的演示和一个简单的testing。

我希望这会帮助别人。 干杯!

如果你在一个新的浏览器上有一个简单的方法。 Object.keys(obj).length == 0

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

    例如:

     var a = {empty:true}; 

    然后你可以很容易地在你的AJAXcallback代码中检查它。

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

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

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

我正在使用这个。

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

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

在Node,Chrom,Firefox和IE 9下testing,对于大多数使用情况来说,

  • (for … in …)是最快的select!
  • Object.keys(obj).length是空对象慢10倍
  • JSON.stringify(obj).length总是最慢的 (不是令人惊讶的
  • Object.getOwnPropertyNames(obj).length比Object.keys(obj)需要更长的时间。在某些系统上.length可能会更长。

底线performance明智,使用:

 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对象为空的详细testing结果和testing代码?

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

jQuery在这种情况下有特殊的functionisEmptyObject()

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

阅读更多关于http://api.jquery.com/jQuery.isEmptyObject/

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

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

JSON类和它的函数( parsingstring化 )是非常有用的,但有一些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 

如果jQuery和Web浏览器不可用,那么在underscore.js中也有一个isEmpty函数。

 _.isEmpty({}) // returns true 

此外,它不假定input参数是一个对象。 对于列表或string或未定义,它也将转向正确的答案。

我的拿:

 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()

一个简单的循环:

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

我发现的最好的方法是:

 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 

你可以检查对象键的数量:

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

除了Thevs回答:

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

这是jquery + jquery.json

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

显示器

    谨防!!  obj不是空的!

     obj = {f:function(){}}

     JSON.stringify(obj)

    回报

     {}

Sugar.JS为此提供了扩展对象。 代码干净简单:

制作扩展对象:

 a = Object.extended({}) 

检查它的大小:

 a.size() 

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

该脚本适用于ES6。

  const isEmpty = (obj) => { if (obj === null || obj === undefined || Array.isArray(obj) || typeof obj !== 'object' ) { return true; } return Object.getOwnPropertyNames(obj).length === 0 ? true : false; }; 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 

这一行代码有帮助

 var a = {}; //if empty returns false (Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns False var a = {b:2} //if not empty returns true (Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(a).length != 0 : (function(){for(var key in a) break; return (key != null) && (key != undefined);})()) //Returns true 

Object.getOwnPropertyNames在ECMA-5中实现。 上面的行在旧版浏览器中有一个后备function。

JSFiddler

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

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

显然,所有这些库都不完全相同,所以如果你需要轻松操纵DOM,那么jQuery可能仍然是一个不错的select,或者如果你需要更多的types检查,然后lodash或下划线可能是好的。 至于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 === ''; } }; 

如果你不想引入一个库(这是可以理解的),并且你知道你只是检查对象(不是数组或string),那么下面的函数应该适合你的需求。

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

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

我不能相信,经过两年的编程js它从来没有点击过,空的对象和数组不是虚假的,最奇怪的是它从来没有抓到我。

这将返回true如果input默认为falsey或者它是一个空的对象或数组。 相反是trueishfunction

http://codepen.io/synthet1c/pen/pjmoWL

 function falsish( obj ){ if( (typeof obj === 'number' && obj > 0) || obj === true ){ return false; } return !!obj ? !Object.keys( obj ).length : true; } function trueish( obj ){ return !falsish( obj ); } falsish({}) //=> true falsish({foo:'bar'}) //=> false falsish([]) //=> true falsish(['foo']) //=> false falsish(false) //=> true falsish(true) //=> false // the rest are on codepen 
  isEmpty = function(obj) { if (obj == null) return true; if (obj.constructor.name == "Array" || obj.constructor.name == "String") return obj.length === 0; for (var key in obj) if (isEmpty(obj[key])) return true; return false; } 

这将检查string,数组或对象(地图)的空白。

用法:

 var a = {"a":"xxx","b":[1],"c":{"c_a":""}} isEmpty(a); // true, because acc_a is empty. isEmpty("I am a String"); //false