【问题标题】:Can I use "map" as a substitute for "for each"/"for in"?我可以用“map”代替“for each”/“for in”吗?
【发布时间】:2010-04-23 04:54:50
【问题描述】:

现在有一段时间 javascript has the "map" function 循环遍历数组。

似乎可以将其用作“foreach”运算符,例如:

fruitbowl.map(function(fruit){ 
                  ... do stuff with fruit
              })

这比说好还是坏

for(var i in fruitbowl){ 
     ... do stuff with fruitbowl[i] 
}

无需使用索引,但添加了回调;它似乎不是很常见,所以我犹豫使用它,但仍然想使用它。

【问题讨论】:

  • 不知道浏览器支持怎么样?
  • 浏览器支持是个问题。 “Map”需要 1.5,“forEach”需要 1.6。我看到了一个经验法则:分配时映射,处理时使用 forEach,遗留时使用 for-in。
  • 对于浏览器支持,看看这个:ES5 Compatibility Table.
  • 哦,ffs,msie 不支持。这就是为什么它如此罕见。但是Mozilla 的参考资料中提供的例程可以挽救这一天。

标签: javascript arrays loops


【解决方案1】:

你提到的三种方法有不同的用途。

Array.prototype.map 方法的目的是创建一个新数组,其中包含对每个数组元素调用回调函数的结果。

Array.prototype.forEach 方法的目的是遍历数组,对每个数组元素执行一次提供的回调函数。

for...in 语句的目的是枚举对象属性

我认为应该避免使用for...in 语句来遍历任何类似数组的1 对象,其中真正的目的是迭代 数字索引而不是枚举对象属性(即使知道那些索引是属性)。

避免for...in 迭代类数组对象的原因:

  • 除了数组元素之外,还迭代继承的用户定义属性,如果您使用像 MooTools 这样的库,它扩展了Array.prototype 对象,您将看到所有这些扩展属性。
  • 迭代顺序是任意的,不能按数字顺序访问元素。

看看这篇文章:


1 类数组对象是指任何包含连续数字属性和length 属性的对象

【讨论】:

    【解决方案2】:

    那个使用被认为是有效的,但是仅仅因为它的副作用而使用映射操作是不好的风格。

    【讨论】:

      【解决方案3】:

      可读性很重要。这张地图可能会让那些从未见过它以这种方式使用过的人感到困惑。它违反了“最小惊喜原则”。

      【讨论】:

        【解决方案4】:

        在 Perl 中,map 的使用类似但更自然。

        我的经验法则是,如果它的阅读效果不如循环,那就不要使用它。难以调试。但是对于certain functions,map 比循环更自然。如果您需要为此挠头——不要这样做。可怜那个跟着你的人,包括以后的你自己!

        【讨论】:

          【解决方案5】:

          不要使用 map 的副作用。如果您的任务是遍历数组以对每个对象执行某些操作,请使用 foreach。如果您正在映射值,例如转义字符串数组,使用map。没有什么比聪明更清晰和程序员意图更重要了。

          【讨论】:

            猜你喜欢
            • 2011-10-31
            • 2022-01-23
            • 2013-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-20
            • 2013-11-04
            • 2011-01-14
            相关资源
            最近更新 更多