用Javascript中的if语句包装in循环 - 循环遍历数组

时间:2009-10-26 18:34:26

标签: javascript jslint

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 个答案:

答案 0 :(得分:9)

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

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

虽然你可以用hasOwnProperty打败这个案例来检查它不是一个原型成员,但这比用for (var i= 0...)正确的做法更加丑陋,所以为什么要这么麻烦。

此外,对于for...in,您不一定会按照您的预期按数字顺序获取项目。

  

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

是的,你可以忽略那一个。

它希望您从第二个var中删除for (i...,因为在同一范围内声明两次变量不会执行任何操作。但是我建议将var留在那里,因为它没有任何伤害,如果你将循环移动到另一个块,你不希望它突然在全局上涂鸦。

答案 1 :(得分:8)

真的,你不必听jslint。但如果你真的想要传递(这很好)你可能会这样做:

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

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

答案 2 :(得分:4)

如果查看JSLint文档,您将找到一个解释the rationale behind filtering for-in loops的链接:基本上,它是为了避免绊倒已添加到对象原型的任何可枚举属性。 (尽管你不应该使用for-in来迭代数组。)

在第二种情况下,您将变量声明两次:变量在JavaScript中具有函数作用域(或全局作用域)。 Douglas Crockford,以及JSLint,认为最好只为变量所在的范围声明变量一次:

var i;

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

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

答案 3 :(得分:0)

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

无论如何,迭代数组的最佳方法是使用进行循环而不是进行循环。

如果您需要详细解释,请阅读此post