如果我使用以下方式设置对象:
var a = {};
或
var a = new Object();
如果我不知道具体要测试什么,我怎样才能测试它内部是否有任何东西。
(类似于== {},但这不能正确评估)
答案 0 :(得分:4)
您可以使用这个简单的功能:
function isEmpty(object) {
for(var property in object) {
if(object.hasOwnProperty(property))
return false;
}
return true;
}
但是如果你使用jQuery:http://api.jquery.com/jQuery.isEmptyObject/
答案 1 :(得分:2)
这似乎是一个无辜的问题,一个简单的解决方案,因为@SiteSafeNL提供的似乎可以工作,但是有一个实现错误没有被考虑,IE {DontEnum} Bug。
如果您的目标是IE8及以下,则需要实现以下内容:
var isEmpty = (function () {
var hasOwn = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:0}.propertyIsEnumerable("toString"),
dontEnums = ['toString', 'toLocaleString',
'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable',
'constructor'];
return function (o) {
for (var p in o) {
if (hasOwn.call(o, p))
return false
}
if (hasDontEnumBug) { // IE8 and below
var i = dontEnums.length;
while(i--) {
if (hasOwn.call(o, dontEnums[i]))
return false;
}
}
return true;
};
})();
现在在实现ECMAScript 5的现代浏览器中,@ Alnitak提到您可以使用Object.keys
,但在ES5中,我们现在可以定义非可枚举属性,这些属性赢了“ t出现在for-in
循环中,如果需要检测它们,则必须使用其他方法,例如,使用上述函数,或Object.keys
:
var obj = Object.create(null, { foo: { value: 1, /* enumerable:false... */} });
isEmpty(obj); // true
Object.keys(obj).length; // 0
// But the property exists:
obj.hasOwnProperty('foo'); // true
obj.foo; // 1
如果你想捕获不可枚举的自有属性,我们需要另一种方法,这就是Object.getOwnPropertyNames
方法存在的原因:
function isEmpty(obj) {
return Object.getOwnPropertyNames(obj).length == 0;
}
答案 2 :(得分:1)
在ECMAScript 5中,您可以使用:
if (Object.keys(a).length === 0) {
...
}
注意:这只会找到可枚举的属性。