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

Dev*_*Dev 8 javascript jslint

JSLint一直在抱怨这样的事情

var myArray = [1, 2, 3];
for (var value in myArray)
{
   // BLAH
}
Run Code Online (Sandbox Code Playgroud)

说我应该把它包装在if语句中.我知道如果你循环一个对象的属性你需要包装它,但是在这里我应该在if语句中放置什么来进行正确的过滤.

另外,当我做类似的事情

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

for (var i =0; i < 20; i++)
{
   // bar
}
Run Code Online (Sandbox Code Playgroud)

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

bob*_*nce 9

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

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

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

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

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

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

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


Ale*_*ton 8

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

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

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