之前在项目小重构的时候想试试号称Underscore继承者的Lodash,无痛迁移,而且新的API也很好用,这几天调一个bug的时候却发现_.each的结果怎么都不对。

翻Lodash 文档才发现人家都明明白白地写了:

_.forEach(collection, [callback=identity], [thisArg])

Iterates over elements of a collection, executing the callback for each element. The callback is bound to thisArg and invoked with three arguments; (value, index|key, collection). Callbacks may exit iteration early by explicitly returning false.

这一点跟Underscore使用的原生JS不太一样。

其实也只有callback的返回值是false的时候遍历才会停止,我们一般手写JS代码单纯地用forEach遍历数组的时候使用return也只是想进入对下个元素的处理,不会给返回值赋什么意义,于是函数的返回值为undefined。所以用Lodash一直也没有什么问题。

但是在项目里你要用Coffeescript,保不准就呵呵了:

segments = [1, 2, 3, 4]
lessThanThree = true
_.each segments, (seg, index) ->
    console.log seg
    if index > 2
        lessThanThree = false

# 在Underscore下输出是
1
2
3
4

# Lodash下输出是
1
2
3