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

时间:2010-11-12 16:06:55

标签: javascript jslint

我正在使用 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标记

5 个答案:

答案 0 :(得分:40)

如果keypairs是一个数组,那么你应该重复遍历以下元素:

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

如果keypairs是哈希值,那么JSLint正确地建议您检查是否在相应的密钥类型上运行(即,确认哈希值是预期的类型)

类似

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

其中if验证无论什么标准确保您不访问原型函数等。

答案 1 :(得分:16)

它希望您使用hasOwnProperty

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

与JSLint相似,这是一个建议,其适用性取决于您的情况。如果对象的原型中存在不需要的enumerable属性,则非常有用。例如,如果您是使用某些JavaScript库。

答案 2 :(得分:5)

for...in的问题在于您还将遍历原型的属性,并且大部分时间这不是您想要的。这就是为什么你应该用hasOwnProperty测试属性:

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

答案 3 :(得分:3)

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

这是因为for / in循环可能会迭代第三方库扩展的某些方法,例如如果有

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

然后没有.hasOwnProperty()条件,.clone方法也会在...中迭代。

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

您可以通过选中“容忍未过滤”来关闭此警告。

答案 4 :(得分:0)

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

部分

for in

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