如果我设置使用对象:如何判断对象是否为空?
var a = {};
或
var a = new Object();
我怎样才能测试它是否具有里面任何东西,如果我不知道具体要测试什么。
(有点像== {},但这并不能正确地评价)
如果我设置使用对象:如何判断对象是否为空?
var a = {};
或
var a = new Object();
我怎样才能测试它是否具有里面任何东西,如果我不知道具体要测试什么。
(有点像== {},但这并不能正确地评价)
你可以使用这个简单的功能:
function isEmpty(object) {
for(var property in object) {
if(object.hasOwnProperty(property))
return false;
}
return true;
}
但是,如果你使用jQuery:http://api.jquery.com/jQuery.isEmptyObject/
完美! JS方法和以前我不熟悉的jQuery方法都很好。谢谢! – Maxx
这似乎是一个无辜的问题,一个简单的解决方案就像@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现在我们有限定非枚举的属性的功率,这些特性将不会出现在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;
}
如果你的目标IE8及以下检查我的回答,接受的答案不参与帐户IE的DontEnum错误...干杯! – CMS