javascript中forEach,map,for of的应用场景与效率?

这裡讨论的是lodash版本的_.forEach和_.map,原生ES6 javascript的for of这三种方法。
目前我的使用思路是,如果是要遍历并改变Array并回传一个新的Array,那我就选择_.map。

至于for of 和_.forEach,我用了以下的方式测试效能:

forEach

https://img3.mukewang.com/5c29b3e60001be2f03450208.jpg

for of

https://img1.mukewang.com/5c29b3ef00012e1203180213.jpg

for of速度大胜_.forEach,所以在遍历Array时,我现在会使用for of而不是_.forEach。

我想问的是,这样的思路有问题吗?
_.forEach要在什麽时候使用呢?

我自己想到的_.forEach使用时机是遍历Object时,javascript原生的话应该是和for in比较。


哈士奇WWW
浏览 1524回答 1
1回答

慕森卡

有问题。JS中不存在传统意义上的数组,静态语言中,数组是一段连续的内存,每一个元素都是固定字节长度的,所以通过下标可以取地址,快速找到引用值。但是JS中的数组是对象,这导致你遍历数组时,其实是在遍历对象的key(静态语言中的HashMap),而JS中对数组类型的遍历做了特殊处理,所以foreach遍历不到非数值类型的键,这也解释了为什么foreach比forin慢,因为多了一层判断。但是如果你使用forin遍历数组,会带出非数字键:var x = [1, 2, 3];x.a = 'a';x.b = 'b';x.c = 'c';for (let k in x)  console.log(k)即使你不会这么干,谁知道你的同伴们呢?第三方框架中呢?自定义原型链呢?结论:ES5中遍历数组还是老老实实的foreach或者for循环.你的例子中使用的是ES6,由于Array类型实现了Iterator接口,所以forof是安全的,但是如果通过babel编译成es5,我猜想由于需要引入Iterator的pollyfill,效率不可能比foreach高。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript