我正在挖掘jQuery源代码,我发现他们使用这个小代码片段来检测JavaScript对象是否为空.
function isMyObjEmpty( obj ) {
var name;
for (name in obj ) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么这有效吗?我只是不明白为什么这会回归真实.
Ben*_*aum 17
这使用for... in循环来遍历对象的属性.
如果对象具有任何属性,它将进入循环并返回 false
如果对象没有属性,则不会进入循环,并返回true.
请注意,存在不起作用的情况.for.. in循环只遍历enumerable属性,所以从技术上讲,一个对象可以是非空的,它仍然会返回false.可以将属性定义为不可枚举并欺骗此方法.这是一个有问题的案例.
正确的说法是,此方法检查对象是否具有任何可枚举属性.
描述:检查对象是否为空(不包含可枚举的属性).
我个人觉得他们会称这种方法很奇怪isEmptyObject.我认为一个更合适的名字hasNoEnumerableProperties.
在JS的新实现中,可以使用Object.getOwnPropertyNames.getOwnPropertyNames获取所有属性,可枚举与否.
您可以实现isMyObjEmpty用Object.getOwnPropertyNames(myObject).length===0.这将检查对象是否没有可枚举的属性.
但是,这并不会检查原型属性.这可能是,也可能不是理想的行为,你可以查看我对shadowmonkey的讨论.这可以通过Object.getPrototypeOf递归调用并检查原型链中的属性来轻松解决.
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |