8

JSLint 一直在抱怨这样的事情

var myArray = [1, 2, 3];
for (var value in myArray)
{
   // BLAH
}

说我应该把它包装在一个 if 语句中。我意识到如果要循环遍历对象的属性,则需要包装它,但是在这里我应该在 if 语句中放入什么来进行正确的过滤。

另外,当我做类似的事情时

for (var i = 0; i < 10; i++)
{
   // foo
}

for (var i =0; i < 20; i++)
{
   // bar
}

它抱怨我已经被定义了。除了使用不同的变量名之外,我如何防止这种情况发生?

4

4 回答 4

9

JSLint 抱怨很多并不是真正有害的东西。在这种情况下,抱怨 是正确的for...in,因为这是循环数组的错误构造。

这是因为您不仅会获得数字键,还会获得已添加到数组或其 Array.prototype 的任何其他任意属性。后者通常来自框架添加的扩展实用程序功能。

虽然您可以通过hasOwnProperty检查它不是原型成员来击败该案例,但它比仅以正确的方式进行更丑陋,for (var i= 0...)所以为什么要打扰。

此外,for...in您不一定会像您期望的那样按数字顺序获取项目。

它抱怨我已经被定义了。除了使用不同的变量名之外,我如何防止这种情况发生?

是的,你可以忽略那个。

它希望您var从 second中删除for (i...,因为在同一范围内两次声明一个变量不会做任何事情。但是我建议离开var那里,因为它不会造成任何伤害,并且如果您将循环移动到另一个块,您不希望它突然在全局变量上乱涂乱画。

于 2009-10-26T18:44:36.773 回答
8

真的,你不必听 jslint。但是,如果您真的想通过(这很好),您可以这样做:

var myArray = [1, 2, 3];
for (var value in myArray)
{
  if (myArray.hasOwnProperty(value)) {
    // BLAH
  }
}

对于第二部分,您要么必须将它们放入函数中,要么使用不同的变量。另一种解决方案是只使用i而不是var i第二次,因为它已经定义了......

于 2009-10-26T18:43:08.507 回答
4

如果您查看 JSLint 文档,您会发现一个链接解释了过滤 for-in 循环背后的基本原理:基本上,这是为了避免绊倒已添加到对象原型中的任何可枚举属性。(尽管无论如何您都不应该使用 for-in 来遍历数组。)

在第二种情况下,您两次声明变量:变量在 JavaScript 中具有函数范围(或全局范围)。道格拉斯·克罗克福德(Douglas Crockford)和 JSLint 认为,最好在变量所在的范围内只声明一次变量:

var i;

for (i = 0; i < 10; i++)
{
   // foo
}

for (i =0; i < 20; i++)
{
   // bar
}
于 2009-10-26T18:45:09.347 回答
0

我建议遵循 JSLint 作为一个很好的参考点,你可能想要配置一些选项,让你检查得更宽松。

无论如何,遍历数组的最佳方法是使用for循环而不是for in循环。

如果你想要详细的解释,请阅读这篇文章

于 2010-12-06T13:53:32.697 回答