这个函数如何确定一个对象是空的?

我正在挖掘jQuery源代码,我发现他们使用这个小代码片段来检测JavaScript对象是否为空。

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

有人可以向我解释为什么这有效吗? 我只是不明白为什么这会回归真实。

为何如此有效:

这使用for... in循环来遍历对象的属性。

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

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

为什么不:

请注意,存在不起作用的情况。 for.. in循环只遍历enumerable属性,所以从技术上讲,一个对象可以是非空的,它仍然会返回false。 可以将属性定义为不可枚举并欺骗此方法。 这是一个有问题的案例 。

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

文档说的是什么:

您可以在此处找到该方法的文档 。

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

我个人觉得很奇怪他们会调用该方法isEmptyObject 。 我认为更合适的名称是hasNoEnumerableProperties

如果你真的想检查一个Object是否为空怎么办?

在JS的较新实现中,可以使用Object.getOwnPropertyNamesgetOwnPropertyNames获取所有属性,可枚举与否。

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

但是,这并不会检查原型属性。 这可能是,也可能不是理想的行为,你可以查看我对shadowmonkey的讨论。 通过递归调用Object.getPrototypeOf并检查原型链中的属性,可以很容易地解决这个问题。

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

试试这个。 我认为这是因为对象自己的属性。 您需要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

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

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

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

什么时候它会返回true,当对象是空的时候。

 isMyObjEmpty({}); 

它是如何工作的? 通过使用… in


对于在…

摘要

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

因此,如果没有属性 ,它将不会进入for循环。 该循环确实应该检查hasOwnProperty()因为这可能导致误报。