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

Hea*_*erK 30 javascript jslint

我正在使用JSLint工具来确保我的JavaScript是"严格的".

我收到以下错误但不明白如何解决它:

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
Run Code Online (Sandbox Code Playgroud)

对于以下代码:

for (var i in keypairs) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法如何解决它的JavaScript"严格",并且不会被JSLint标记

Chr*_*ter 40

如果keypairs是一个数组,那么你应该迭代这些元素:

for(var i = 0; i < keypairs.length; i++) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

所以像

for(var i in keypairs) {
  if(keypairs.hasOwnProperty(i)) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1,只是一个注释:数组迭代的更好模式是`for(var i = 0,l = keypairs.length; i <l; ++ i){...}`.由于局部变量(相对于长度属性)的查找开销较少,因此速度稍快.这也是CoffeeScript会产生的:-). (6认同)

Mat*_*hen 16

它希望你使用hasOwnProperty.

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i))
    {
        // Use i
    }
}
Run Code Online (Sandbox Code Playgroud)

像JSLint一样,这是一个推荐,它的适用性取决于你的情况.如果对象的原型中存在不需要的可枚举属性,则非常有用.如果您使用某些JavaScript库,则可能就是这种情况.


Fel*_*ing 5

问题for...in是您还将遍历原型的属性,并且大部分时间这不是您想要的.这就是你应该用以下方法测试该属性的原因hasOwnProperty:

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)