如果我们正在循环访问当前项目,哪个更适合/ forEach?

每个人都在说什么for更高性能,然后forEach例如

https://jsperf.com/for-vs-foreach/37

Javascript效率:“for”vs“forEach”

但是当访问循环中的当前元素时它是否成立。

如果不是,为什么不,如果是的话,下面的代码是什么呢,在不同的情况下会产生矛盾的结果:

逻辑:

 //---------------------------------------- var arr = [], len = 1000000, nos = 100; for(var t = 0; t<len; t++) { arr.push({ a:'a',b:'b',t:Math.random() }); } //---------------------------------------- //===========forEach start==================== var tp1 = new Date(); arr.forEach( (ik)=>{ let tmp = []; for(let x = 0;x<nos;x++){ tmp.push(ik.a); } }); var tp2 = new Date(); //===========forEach end==================== //===========for loop start(let outside loop)==================== var t1 = new Date(); let i; for(i = 0; i<arr.length; i++){ let tmp = []; for(let x = 0;x<nos;x++){ tmp.push(arr[i].a); } } var t2 = new Date(); //===========for loop end(let outside loop)==================== //===========for loop start(let inside loop)==================== var ti1 = new Date(); for(let i = 0; i<arr.length; i++){ let tmp = []; for(let x = 0;x<nos;x++){ tmp.push(arr[i].a); } } var ti2 = new Date(); //===========for loop start(let inside loop)==================== //---------------------------------------- var dff = t2-t1; var dffi = ti2-ti1; var dffp = tp2-tp1; console.log("Execution Time:- (let outside loop): ",dff); console.log("Execution Time:- (let inside loop): ",dffi); console.log("Execution Time:- forEach: ",dffp); console.log("Execution Time:- forEach - for(inside loop): ",dffp-dffi); console.log("Execution Time:- forEach - for(outside loop): ",dffp-dff); //---------------------------------------- 

其输出如下:

情况1:nos = 100

 Execution Time:- (let outside loop): 3739 Execution Time:- (let inside loop): 3699 Execution Time:- forEach: 730 Execution Time:- forEach - for(inside loop): -2969 Execution Time:- forEach - for(outside loop): -3009 

情况2:nos = 10

 Execution Time:- (let outside loop): 427 Execution Time:- (let inside loop): 396 Execution Time:- forEach: 98 Execution Time:- forEach - for(inside loop): -298 Execution Time:- forEach - for(outside loop): -329 

情况3:nos = 2

 Execution Time:- (let outside loop): 106 Execution Time:- (let inside loop): 125 Execution Time:- forEach: 90 Execution Time:- forEach - for(inside loop): -35 Execution Time:- forEach - for(outside loop): -16 

情况4:nos = 1

 Execution Time:- (let outside loop): 62 Execution Time:- (let inside loop): 85 Execution Time:- forEach: 72 Execution Time:- forEach - for(inside loop): -13 Execution Time:- forEach - for(outside loop): 10 

情况5:nos = 0

 Execution Time:- (let outside loop): 17 Execution Time:- (let inside loop): 23 Execution Time:- forEach: 72 Execution Time:- forEach - for(inside loop): 49 Execution Time:- forEach - for(outside loop): 55 

经过一些分析,我减less了一些事实:

  • 基本上循环是更高性能然后forEach通过执行
  • 两者都有一个本地(C / C ++)实现循环。
  • forEach具有native(在c / c ++层)实现,用于访问callback中提供的当前元素。

扣除

  1. 在第三点的情况下,当我们迭代访问当前元素时, forEach会给出更快的结果,因为它将在本地执行,但在for循环的情况下它必须传递到两层JS然后native

  2. 如果forEach对于current_item,index,array是更有效的variables分辨率,因为它们是通过本地方法的callback传递的,但是对于for loop来说它不是