为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哈士奇WWW 2018-11-21 17:15:42
这裡讨论的是lodash版本的_.forEach和_.map,原生ES6 javascript的for of这三种方法。目前我的使用思路是,如果是要遍历并改变Array并回传一个新的Array,那我就选择_.map。至于for of 和_.forEach,我用了以下的方式测试效能:forEachfor offor of速度大胜_.forEach,所以在遍历Array时,我现在会使用for of而不是_.forEach。我想问的是,这样的思路有问题吗?_.forEach要在什麽时候使用呢?我自己想到的_.forEach使用时机是遍历Object时,javascript原生的话应该是和for in比较。
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

有问题。
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高。


查看完整回答
反对 回复 2018-12-31
  • 1 回答
  • 0 关注
  • 1523 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号