在AJAX请求之后,有时我的应用程序可能返回一个空对象,例如:
var a = {};
如何检查情况呢?
如何测试一个空的JavaScript对象?
在AJAX请求之后,有时我的应用程序可能返回一个空对象,例如:
var a = {};
如何检查情况呢?
第162篇《如何测试一个空的JavaScript对象?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点
jQuery isEmptyObject()
在这种情况下具有特殊功能:
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
我会去检查它是否至少有一把钥匙。这就足以告诉我它不是空的。
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
根据Object.entries()上的ES2017规范,使用任何现代浏览器均可轻松进行检查-
Object.entries({}).length === 0
我正在用这个。
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;
}
旧的问题,但是有问题。如果您唯一的目的是检查对象是否为空,那么包含JQuery并不是一个好主意。相反,只需深入JQuery的代码,您就会得到答案:
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
对于空对象,使用Object.keys(obj).length(如上文ECMA 5+所建议)的速度要慢10倍!保持旧学校(for ... in)的选择。
经过在Node,Chrome,Firefox和IE 9下的测试,很明显对于大多数用例:
明智地使用底线,请使用:
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;
}
请参阅“对象为空吗?”中的详细测试结果和测试代码。
您可以检查对象键的数量:
if (Object.keys(a).length > 0) {
// not empty
}
如果您使用的是较新的浏览器,则有一种简单的方法。
Object.keys(obj).length == 0
这是我的首选解决方案:
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
您可以使用Underscore.js。
_.isEmpty({}); // true
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
不过请注意,这会创建不必要的数组(的返回值keys
)。
ECMA 5之前的版本:
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery.isEmptyObject({}); // true
_.isEmpty({}); // true
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
对于那些同样的问题但使用jQuery的人,可以使用jQuery.isEmptyObject。
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
参见http://bencollier.net/2011/04/javascript-is-an-object-empty/
没有简单的方法可以做到这一点。您必须显式地遍历属性:
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;
}
相似问题
问题类别
If jQuery and the web browser is not available, there is also an isEmpty function in underscore.js.
Additionally, it does not assume the input parameter to be an object. For a list or string or undefined, it will also turn the correct answer.