33

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

4

5 回答 5

42

如果keypairs是一个数组,那么您应该真正迭代以下元素:

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

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

所以像

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

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

于 2010-11-12T16:10:11.450 回答
18

它希望你使用hasOwnProperty.

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

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

于 2010-11-12T16:09:52.497 回答
5

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

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
于 2010-11-12T16:09:57.460 回答
3
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”来关闭此警告。

于 2010-11-12T16:10:08.410 回答
0

take a look at jslint's own documentation: http://www.jslint.com/lint.html jump down to the section

for in

they do the following: for (name in object) { if (object.hasOwnProperty(name)) { .... } }

于 2012-11-09T16:17:46.550 回答