JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”

Posted

技术标签:

【中文标题】JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”【英文标题】:JavaScript: JSLint error "The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype" 【发布时间】:2011-05-09 04:03:38 【问题描述】:

我正在使用 JSLint 工具来确保我的 javascript 是“严格的”。

我收到以下错误,但不知道如何解决:

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype

对于以下代码:

for (var i in keypairs) 
    ...

任何人都知道如何解决这个问题,因为它是 JavaScript “严格”并且不会被 JSLint 标记

【问题讨论】:

【参考方案1】:

如果keypairs 是一个数组,那么您真的应该遍历以下元素:

for(var i = 0; i < keypairs.length; i++) 
  ...

如果keypairs 是一个散列,那么 JSLint 正确地建议您检查您是否在适当的键类型上进行操作(即确认散列是预期的类型)

有点像

for(var i in keypairs) 
  if(keypairs.hasOwnProperty(i)) 
    ...
  

if 验证任何标准以确保您没有访问原型函数等。

【讨论】:

+1,请注意:数组迭代的更好模式是for (var i = 0, l = keypairs.length; i &lt; l; ++i) ... 。由于局部变量的查找开销较小(相对于长度属性),这会稍微快一些。这也是 CoffeeScript 会生成的 :-)。【参考方案2】:

它希望你使用hasOwnProperty

for (var i in keypairs) 
    if(keypairs.hasOwnProperty(i))
    
        // Use i
    

与 JSLint 的大部分内容一样,这是一个建议,其适用性取决于您的具体情况。如果对象的原型中有不想要的enumerable 属性,这很有用。如果您例如,这可能就是这种情况。使用某些 JavaScript 库。

【讨论】:

【参考方案3】:

for...in 的问题在于,您还将遍历原型的属性,而且大多数时候这不是您想要的。这就是为什么您应该使用hasOwnProperty 测试该属性:

for (var i in keypairs) 
    if(keypairs.hasOwnProperty(i) 
        //...
    

【讨论】:

【参考方案4】:
for (var i in keypairs) 
   if (keypairs.hasOwnProperty(i)) 
       ...
   

这是因为for/in 循环可能会迭代由 3rd 方库扩展的某些方法,例如如果有一个

Object.prototype.clone = function()  ... 

那么如果没有.hasOwnProperty() 条件,.clone 方法也会在... 中迭代。

这在http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ 中有进一步解释,链接自 JSLint 页面本身。

您可以通过选中“Tolerate unfiltered for in”来关闭此警告。

【讨论】:

【参考方案5】:

看看 jslint 自己的文档: http://www.jslint.com/lint.html 跳转到该部分

他们执行以下操作: for (name in object) if (object.hasOwnProperty(name)) ....

【讨论】:

以上是关于JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”的主要内容,如果未能解决你的问题,请参考以下文章

带有闭包的 JavaScript For 循环导致 JSLint 警告

尝试重写for循环,得到jslint错误

无法使用内联代码删除 Aptana 中的 Javascript JsLint 错误

如何使用 jenkins 中的 jslint 和违规插件查找特定错误?

JSLint检测Javascript语法规范

未声明 Javascript 警报中的 JSLint 混淆