Javascript 循环数组:临时保存数组[i]还是继续调用数组[i]?哪个更好/更快?

Javascript 循环数组:临时保存数组[i]还是继续调用数组[i]?哪个更好/更快?,javascript,arrays,performance,for-loop,Javascript,Arrays,Performance,For Loop,我试图找出在for循环中处理数组项时是否应该临时复制它。 性能有什么不同吗?除了让代码更可读之外。 (JavaScript) var max=someArray.length; 对于(变量i=0;iblablabla){ //... } } 或: var max=someArray.length; 对于(变量i=0;i

我试图找出在for循环中处理数组项时是否应该临时复制它。 性能有什么不同吗?除了让代码更可读之外。 (JavaScript)

var max=someArray.length;
对于(变量i=0;iblablabla){
//...
}
}
或:

var max=someArray.length;
对于(变量i=0;i
警告:当您需要担心特定的性能问题时,请担心性能。在那之前,写下你和你的团队认为最清楚、最不容易出错的东西。99.9999999%的情况下,给定循环的具体性能在现实世界中并不重要

话虽如此:

对于现代JavaScript,我可能会使用
for of
循环(ES2015+):

理论上,它在后台使用迭代器,这涉及函数调用;实际上,如果您处理的是一个实际的数组,并且该数组使用标准迭代器,那么如果循环是一个热点(如果不是热点,则不值得担心),JavaScript引擎将能够优化循环

如果
i
someArray
在循环中没有改变,并且
someArray
只是一个普通的数组,那么JavaScript引擎可能能够将其优化为类似于第二个循环的内容。作为一种风格,在of之前,我总是在循环中使用一个局部,而不是每次都重新键入
someArray[I]
,但这只是因为键入
tmp
(或一些更有意义的名称)比键入
someArray[I]
更容易

如果有理由相信某个特定的循环速度很慢(因此出于某种原因,它没有得到优化),那么我可能会使用类似于您的第二个示例的内容:

for (let i = 0, max = someArray.length; i < max; i++) {
   const tmp = someArray[i];
   if (tmp.position.y > blabla) {
       //...
   }
}
for(设i=0,max=someArray.length;iblabla){
//...
}
}

但同样,这主要是一个风格问题,直到/除非您有一个正在诊断和修复的特定性能问题。

好问题,您是否尝试设置了一个jsperf来找出问题。
var max = someArray.length;
for (var i = 0; i < max; i++) {
   var tmp = someArray[i]; // <---- CHANGE
   // Here I will use tmp quite often. Like this:
   if (tmp.position.y > blabla) {
       //...
   }
}
for (const entry of someArray) {
    if (entry.position.y > blabla) {
        // ...
    }
}
for (let i = 0, max = someArray.length; i < max; i++) {
   const tmp = someArray[i];
   if (tmp.position.y > blabla) {
       //...
   }
}