在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:
var a = {};
我怎样才能检查是否是这种情况?
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
没有简单的方法可以做到这一点.您必须显式遍历属性:
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.
这是我的首选解决方案:
var obj = {}; return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
您可以使用Underscore.js.
_.isEmpty({}); // true
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
如果您使用的是较新的浏览器,则有一种简单的方法.
Object.keys(obj).length == 0
您可以检查对象键的计数:
if (Object.keys(a).length > 0) { // not empty }
使用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对象为空的详细测试结果和测试代码?
只是一个解决方法.如果没有数据,您的服务器可以生成一些特殊属性吗?
例如:
var a = {empty:true};
然后,您可以在AJAX回调代码中轻松检查它.
检查它的另一种方法:
if (a.toSource() === "({})") // then 'a' is empty
编辑:如果您使用任何JSON库(fe JSON.js),那么您可以尝试JSON.encode()函数并针对空值字符串测试结果.
我已经创建了一个完整的函数来确定对象是否为空.
它使用Object.keys
从ECMAScript中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的演示和简单的测试.
我希望它能帮助别人.干杯!
我正在使用这个.
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; }
以下示例显示如何测试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
function isEmpty(obj) { for(var i in obj) { return false; } return true; }
根据Object.entries()上的ES2017规范,使用任何现代浏览器检查都很简单 -
Object.entries({}).length === 0
jQuery isEmptyObject()
对于这种情况有特殊功能:
jQuery.isEmptyObject({}) // true jQuery.isEmptyObject({ foo: "bar" }) // false
阅读更多信息,请访问http://api.jquery.com/jQuery.isEmptyObject/
在幕后,所有库中的所有空检查方法都使用对象键检查逻辑。使它易于理解是一种奇怪的方式,您可以将其放入方法中,在此进行描述。
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
我会去检查它是否至少有一把钥匙.这足以告诉我它不是空的.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
你可以使用这个不使用jQuery或其他库的简单代码
var a=({}); //check is an empty object if(JSON.stringify(a)=='{}') { alert('it is empty'); } else { alert('it is not empty'); }
JSON类及其函数(parse和stringify)非常有用,但是IE7存在一些问题,您可以使用这个简单的代码http://www.json.org/js.html修复它.
其他简单方法(最简单的方法):
您可以使用这种方式而不使用jQuery或JSON对象.
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) { 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 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()
目前都在实施.
如果jQuery和Web浏览器不可用,则underscore.js中还有一个isEmpty函数.
_.isEmpty({}) // returns true
此外,它不会将输入参数视为对象.对于列表或字符串或未定义,它也将转换正确的答案.
正确答案是:
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
这检查:
该对象没有自己的属性(无论可枚举性如何).
该对象没有自己的属性符号.
对象的原型正是如此Object.prototype
.
换句话说,该对象与创建的对象无法区分{}
.
警告!谨防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 {}
除了Thevs答案:
var o = {}; alert($.toJSON(o)=='{}'); // true var o = {a:1}; alert($.toJSON(o)=='{}'); // false
这是jquery + jquery.json
Sugar.JS为此提供了扩展对象。代码简洁明了:
制作一个扩展对象:
a = Object.extended({})
检查它的大小:
a.size()