当然可以做到:
var obj = {};
if(Object.keys(obj).length == 0)
但我很好奇是否有办法说:
var obj = {};
if(obj.hasKeys())
甚至:
//already tested, and this doesnt work. its true because it *is* something.
var obj = {};
if(!obj)
答案 0 :(得分:4)
function hasKeys(o) {
for (var name in o)
if (o.hasOwnProperty(name))
return true;
return false;
}
答案 1 :(得分:3)
这将检测可枚举的属性,is inherited from the Object.prototype
就像你的例子一样:
Object.defineProperty(Object.prototype, "hasKeys", {
configurable: true,
value: function() {
for (var _ in this) return true;
return false;
}
});
要检测不可枚举的属性,您必须使用Object.getOwnPropertyNames
。
答案 2 :(得分:1)
最好创建一个函数并在需要时调用它:
function isObjectEmpty(object) {
for(var i in object)
if(object.hasOwnProperty(i))
return false;
return true;
}
至少使用这个方法名称,你和你的同伴,可以清楚地看到你正在测试对象的内容。
答案 3 :(得分:1)
没有让你成为自己的功能,你可以至少使用更短的语法,这要归功于JS的强制攻击能力:
if( Object.keys({})[0] ) alert("non-empty object");
这种死亡简单方法的唯一警告是,如果您确实想要检测继承或计算属性,或者如果您以某种方式拥有一个带有空键的对象,那么(希望)非常罕见。例如:{“”:0} ......
注意:我改变了我的原始答案,使其更具可读性。
答案 4 :(得分:0)
没有。你可以让它工作......
Object.prototype.hasKeys = function () {
return Object.keys(this).length > 0
}
......但你不应该;在JavaScript中修改内置类的原型是一个非常糟糕的主意。你最好只编写像is_empty(obj)
这样的实用工具方法,或者使用已经提供类似功能的库,例如Underscore的isEmpty
或jQuery的isEmptyObject
。