如果我们正在循环访问当前项目,哪个更适合/ 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中提供的当前元素。
扣除
-
在第三点的情况下,当我们迭代访问当前元素时,
forEach
会给出更快的结果,因为它将在本地执行,但在for循环的情况下它必须传递到两层JS
然后native
-
如果
forEach
对于current_item,index,array是更有效的variables分辨率,因为它们是通过本地方法的callback传递的,但是对于for loop
来说它不是