我知道在浏览器中按照
的顺序编写for循环更为理想 for(var i=0, l=arr.length; i<l; i++){ }
而不是
for(var i=0; i<arr.length; i++){ }
但这在NodeJS中是真的还是V8引擎对它进行了优化?
我知道在ecma-262 5.1 sec-15.4数组长度定义如下:
length属性的值在数值上大于名称为数组索引的每个属性的名称;无论何时创建或更改Array对象的属性,都会根据需要调整其他属性以保持此不变量。
因此,如果长度没有改变,这个方法会变慢的唯一原因是因为你必须访问该属性。我正在寻找的是一个合理的示例/解释,它将显示V8引擎(在NodeJS中使用)在访问此属性时是否会受到影响。
答案 0 :(得分:4)
如果arr
是纯局部变量并且循环没有以任何方式触及它,那么是。但是,即使优化失败,反复加载相同的字段也不会因CPU缓存而花费任何成本。
答案 1 :(得分:2)
我总是会使用第一个(如果适用)因为它会通知解释器和任何未来的代码读者,循环不会修改数组的长度。
即使它不快(虽然http://jsperf.com/array-length-vs-cached表明它实际上是这样),但从循环外部对常量表达式进行因子分析是一种很好的做法。
答案 2 :(得分:1)
问题是长度的计算。在此示例中,将在每次循环迭代时计算for(var i=0; i<arr.length; i++){ }
语句arr.length
。但是for(var i=0, l=arr.length; i<l; i++){ }
值将在没有任何计算的情况下进行。简单地获取值比计算数组的长度更快
任何编译器都无法优化获取长度,因为它可以更改。所以它计算了每次迭代。