我在研究jQuery源代码时发现他们使用了以下代码片段来检测JavaScript对象是否为空。
function isMyObjEmpty( obj ) {
var name;
for (name in obj ) {
return false;
}
return true;
}
有人能解释一下这个代码为什么可行吗?我就是不明白这样会返回true的原因。
我在研究jQuery源代码时发现他们使用了以下代码片段来检测JavaScript对象是否为空。
function isMyObjEmpty( obj ) {
var name;
for (name in obj ) {
return false;
}
return true;
}
有人能解释一下这个代码为什么可行吗?我就是不明白这样会返回true的原因。
这里使用了一个 for...in
循环来遍历对象的属性。
如果对象有任何属性,它会进入循环并返回false
。
如果对象没有属性,则不会进入循环,并返回true
。
请注意,存在一种情况它无法工作。for..in
循环只通过可枚举
属性,因此从技术上讲,对象可以是非空的,但它仍会返回false
。可以定义一个属性不可枚举,从而欺骗这个方法。 这是有问题的例子。
正确的说法是,该方法检查对象是否具有任何可枚举属性。
您可以在此处找到该方法的文档。
描述:检查对象是否为空(不包含任何可枚举属性)。
我个人认为他们称该方法为isEmptyObject
有些奇怪。我认为更适合的名称应该是hasNoEnumerableProperties
。
在JS的新实现中,可以使用Object.getOwnPropertyNames
。 getOwnPropertyNames
获取所有属性,可枚举或不可枚举。
Object.getOwnPropertyNames(myObject).length===0
实现isMyObjEmpty
,这将检查对象是否具有属性,包括可枚举和不可枚举属性。Object.getPrototypeOf
并检查原型属性,可以轻松解决此问题。obj
中找到了name
,那么obj
中就有东西,而且不是空的;如果无法找到,它将返回true,表示obj
为空。关键在于for..in循环遍历对象的每个属性,但不包括其他内容。如果对象中没有任何内容,则该循环永远不会运行,因此“return false”行永远不会被执行。程序然后继续执行下一行,告诉它返回true。
(这本身就引出了一个有趣的问题。那个for..in循环是否应该包含hasOwnProperty()检查?或者该函数是否实际上意图捕获非自有属性并根据此计算对象为空?)
试试这个。我认为这是因为对象本身的属性。你需要有 hasOwnProperty 来确保不访问它的原型属性。
function isMyObjEmpty( obj ) {
var name;
for (name in obj ) {
if(obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
阅读文档并查看其中写的含义。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in
当对象为空时,它什么时候会返回 true,当然是空的时候。
isMyObjEmpty({});
它是如何工作的?通过使用for...in。
概述
按任意顺序迭代对象的可枚举属性。对于每个不同的属性,可以执行语句。
因此,如果没有属性,它将不会进入for in循环。循环实际上应该检查hasOwnProperty()
,因为这可能导致错误的结果。
obj
上定义了一个或多个属性,则返回false
,表示对象不为空。如果执行到最后,意味着没有找到任何属性,因此表示对象为空。 - Kevin B