【问题标题】:Wrapping For in loops with if statements in Javascript -- looping over arrays用 Javascript 中的 if 语句包装 For in 循环——遍历数组
【发布时间】:2009-10-26 18:34:25
【问题描述】:

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
}

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

【问题讨论】:

    标签: javascript jslint


    【解决方案1】:

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

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

    虽然您可以使用 hasOwnProperty 解决该案例以检查它不是原型成员,但这比使用 for (var i= 0...) 以正确的方式进行操作更丑陋,所以何必费心。

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

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

    是的,你可以忽略那个。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        如果您查看 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
        }
        

        【讨论】:

          【解决方案4】:

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

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

          如果您想了解详细说明,请阅读此post

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-24
            相关资源
            最近更新 更多