Javascript 此函数如何确定对象的属性为空?

Javascript 此函数如何确定对象的属性为空?,javascript,jquery,Javascript,Jquery,我仔细研究了jQuery源代码,发现他们使用这个小代码片段来检测JavaScript对象是否为空 function isMyObjEmpty( obj ) { var name; for (name in obj ) { return false; } return true; } 有人能给我解释一下为什么会这样吗?我只是不明白为什么会返回true。如果它在obj中找到name,那么obj中有一些东西不是空的,如果它不能这样做,它会返回true,

我仔细研究了jQuery源代码,发现他们使用这个小代码片段来检测JavaScript对象是否为空

function isMyObjEmpty( obj ) {
    var name;
    for (name in obj ) {
        return false;
    }
    return true;
}

有人能给我解释一下为什么会这样吗?我只是不明白为什么会返回true。

如果它在
obj
中找到
name
,那么obj中有一些东西不是空的,如果它不能这样做,它会返回true,说obj是空的

为什么它工作: 这将使用循环遍历对象的属性

如果对象有任何属性,它将进入循环并返回
false

如果对象没有属性,它将不会进入循环,并返回
true

为什么没有: 请注意,存在这样一种情况,即它不起作用<代码>用于。。在中,循环只通过
可枚举
属性,因此从技术上讲,对象可以是非空的,并且仍然返回false。一个人不能是可枚举的,并欺骗这个方法

正确的说法是,此方法检查对象是否具有任何可枚举属性

医生说: 你可以找到这个方法的优点

描述:检查对象是否为空(不包含可枚举属性)

我个人觉得很奇怪,他们会把这个方法称为
isEmptyObject
。我认为一个更合适的名字应该是
hasNoEnumerableProperties

如果您真的想检查对象是否为空,该怎么办? 在较新的JS实现中,可以使用
getOwnPropertyNames
获取所有属性,无论是否可枚举

可以使用
Object.getOwnPropertyNames(myObject.length==0
实现
isMyObjEmpty
。这将检查对象是否没有可枚举的属性


然而,这并不检查原型属性。这可能是,也可能不是令人满意的行为,你可以查看我对此的讨论。通过递归调用并检查原型链中的属性,可以很容易地解决这个问题。

当对象为空时,它何时返回true

isMyObjEmpty({});
它是如何工作的?利用


为了……在 总结

以任意方式迭代对象的可枚举属性 秩序。对于每个不同的属性,都可以执行语句


因此,如果没有属性,它将不会进入for-in循环。应该检查循环中的错误,因为这可能导致误报

试试这个。我认为这是因为对象本身的属性。您需要拥有hasOwnProperty,以确保不访问其原型属性

 function isMyObjEmpty( obj ) {
        var name;
        for (name in obj ) {
          if(obj.hasOwnProperty(name)) {
            return false;
          }
        }
        return true;
    }
阅读文档并查看其中所写的含义


也许不是,但我假设混淆来自obj中的键“name”。它实际上并不是在对象中寻找一个名为name的键,而是将对象中的任何键分配给一个它们称为name的变量。因此,如果它在对象中找到任何内容,它将返回false并确认它确实不是空对象。但是如果它在对象中找不到任何内容,它将返回真正意义上的对象为空。

关键是for..in循环会迭代对象的每个属性,而不会迭代其他属性。如果对象中没有任何内容,那么该循环将永远不会运行,因此“return false”行永远不会执行。然后程序转到下一行,这告诉它返回true

function isMyObjEmpty( obj ) {
    var name;
    for (name in obj ) {
        return false;
    }
    return true;
}

(这本身就引出了一个有趣的问题。for..in循环是否应该包含在hasOwnProperty()检查中?或者函数是否真的打算捕获非自有属性并在此基础上将对象计数为非空?

如果在
obj
上定义了一个或多个属性,它返回
false
表示对象不是空的。如果到了最后,这意味着没有找到属性,这意味着对象是空的。问得好,这正是我希望在stackoverflow上看到的问题类型。不,这里有一些代码是坏的,(可能是不完整的)你们能帮我修一下吗,这样我就可以表现得像我在工作中那样,但这里有一个实际的编程问题,我很好奇。。向上投票!伙计们,他是对的。别再贬低他了。因为这已经被否决了,所以被否决了inappropriately@iAmClownShoe-在否决投票时,答案只是一个存根,上面说
当对象为空时,它何时返回true。isMyObjEmpty({})。如果你给出了一个不充分的FGITW答案,那么被否决是你要冒的风险。我一定是错过了。无论哪种方式,既然他已经很好地回答了问题,那么这些否决票都可以删除。因此,它可能不会在所有情况下都起作用,例如,当您检查空对象时,并且特定对象是全局对象的子对象,那么,即使它是空的,您也将始终返回not empty。@BenjaminGruenbaum没有使用for..在您编写的函数中使用上述方法时更为简单?也许,像著名的Douglas Crockford这样的一些人认为for。。。in循环必须具有hasOwnProperty检查。我个人认为这是非常有限的。这里有一些关于它的讨论。它不是像那个讨论那样有局限性吗?除非你使用原型继承,这是大多数情况下…通过使用“hasOwnProperty”,你不是消除了很多风险吗?同样,这取决于,我认为一个在原型上有属性的对象不是空的,虽然添加hasOwnProperty支票是一个很好的建议,但90%的时候我不认为是这样。如果我有一只狗和一个原型动物在一起,而这个动物有一个默认的名字,或者大小,或者方法,或者任何其他属性。我认为我的狗对象不是空的。你可能会有不同的观点,因为这是关于语义的,所以我不认为这有什么问题。我只是想提出这些主题,让未来的读者知道