Javascript 有没有更简单的方法来查看对象是否为空?

Javascript 有没有更简单的方法来查看对象是否为空?,javascript,Javascript,当然我能做到: 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) 不,你可以让它工作 Object.prototype.hasKeys = funct

当然我能做到:

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)

不,你可以让它工作

Object.prototype.hasKeys = function () {
  return Object.keys(this).length > 0
}

。。。但你不应该;在JavaScript中修改内置类的原型是一个非常糟糕的主意。您最好只编写一个实用程序方法,如
is\u empty(obj)
,或者使用一个已经提供类似功能的库,例如下划线或jQuery。

这将检测可枚举属性,就像您的示例:

function hasKeys(o) {
    for (var name in o)
        if (o.hasOwnProperty(name))
            return true;
    return false;
}
Object.defineProperty(Object.prototype, "hasKeys", {
    configurable: true,
    value: function() {
        for (var _ in this) return true;
        return false;
    }
});

要检测不可枚举的属性,您必须使用
对象。getOwnPropertyNames

最好创建一个函数,并在需要时调用它:

function isObjectEmpty(object) {
 for(var i in object) 
  if(object.hasOwnProperty(i))
    return false;

  return true;
}

至少使用此方法命名,您和您的同事可以清楚地看到您测试对象的目的。

由于JS的强制功能,您至少可以使用较短的语法:

if( Object.keys({})[0] ) alert("non-empty object");
这种非常简单的方法唯一需要注意的是,您是否真的想要检测继承的或计算的属性,或者您是否有一个带有空白键的对象,这(希望)是非常罕见的。例如:{“:0}


注意:我修改了我的原始答案,使其更具可读性。

您确实意识到,即使使用
Object.keys
它也可能返回错误的结果,例如当
obj
有一个非平凡的原型时?如果您碰巧使用jQuery:。如果没有,答案会告诉你如何使用vanilla JSI,就像vanilla JS一样。JQ做事情很好,但在任何事情上使用它都非常低效。我不知道哪种方法是最有效的。我喜欢短路,但我打赌得票最多的人会得到答案。@freakish:即使对象继承了属性,对象也可能是空的,因此object.keys(o).length将是快速、自然和简单的…对我来说,不改变原型是有意义的,但是我很喜欢你的回答:你需要说hasOwnProperty吗?或者你可以说:
if(o[name])
你需要使用
hasOwnProperty
。测试
if(o[name])
实际测试存储在键下的值。例如,如果使用
if(o[name])
hasKeys({iAmHidding:false})
将声明对象没有键,因为属性
iAmHiding
的值为false。但是,falsy属性不能隐藏在
hasOwnProperty
中,
hasKeys({iCantHide:false})
将返回true。@squid314但是,如果(o.hasOwnProperty(name))行,您只需删除
。但这取决于OP对“空对象”的定义。是否需要
hasOwnProperty
取决于“空”的确切定义。给定所提供的@fallereneaper示例,它使用
Object.keys(o).length
,我假设这是他/她对“empty”的定义
Object.keys()
指定它返回“对象拥有可枚举属性”(emphasis mine)的列表。因此,我需要一个枚举,它保证只有当属性是对象自己的属性时才返回true。但这是堆栈溢出,在这里判断每个答案和帖子总体答案似乎可以归结为:创建一个函数或为基本对象原型添加一个附录。是的,如果这是你的问题的话:没有本机函数或运算符可以这样做。只有一个建议:我可以想象任意JSON数据可能包含类似“hasKeys:false”的内容,如果你试着叫它,它会扔。修复方法是将全局对象方法命名为ala“_hasKeys”(更好),或者使用命名函数而不是方法来避免冲突(最好)。@dandavis:是的,如果你担心冲突,你就不能使用
对象。prototype
,你应该改用静态函数(避免下划线方法)。我个人已经在
对象
“名称空间”上定义了我的所有对象助手,比如
对象.hasKeys(obj)