Javascript 定义数组';圈前的长度是多少?
我在Ember.js中看到了这个片段:Javascript 定义数组';圈前的长度是多少?,javascript,arrays,performance,loops,Javascript,Arrays,Performance,Loops,我在Ember.js中看到了这个片段: for (var i=0, l=deps.length; i<l; i++) { if (deps[i] === 'exports') { reified.push(exports = {}); } else { reified.push(requireModule(resolve(deps[i]))); } } for(var i=0,l=deps.length;i这与其说是一个良好的实践,
for (var i=0, l=deps.length; i<l; i++) {
if (deps[i] === 'exports') {
reified.push(exports = {});
} else {
reified.push(requireModule(resolve(deps[i])));
}
}
for(var i=0,l=deps.length;i这与其说是一个良好的实践,不如说是一个小型性能优化。在非常大的阵列中,它将产生显著的性能改进。这样做的原因是它“缓存”数组、NodeList等的长度值,这样在循环的退出条件中,您就不必每次都重新访问该属性,因为它存储在变量中
与任何代码一样,性能增益也会有所不同,并且可能更快或更慢,这取决于浏览器。这是一个棘手的问题,因为我们都认为计算长度会更好。但实际上,在任何一种情况下,计算长度都只会发生一次。但是在第一种情况下,除了iterato之外,您还声明了一个变量因此VM需要为它分配一个临时空间,直到循环结束;这就是为什么第一个是最慢的
希望这能对您有所帮助。您是否意识到这两者之间没有什么区别。一个设置变量,一个不设置。较旧的浏览器需要存储长度,这样它才能运行得更快。现代浏览器则没有什么区别。因为for循环中的语句在每次迭代时都会被查找,所以您可以在缓存长度而不是查找长度时节省一点时间在每次迭代中都会更新,但大多数情况下差异并不明显,因此这并不重要。如前所述,较新的浏览器已经在内部对其进行了优化。应该注意的是,如果顺序不重要,那么(var i=deps.length;i--;)的反向迭代通常更容易、更快…
循环的条件部分需要在每次执行循环体之前进行评估。因此i
总是只对两个变量进行比较,而i
理论上总是需要访问deps
的属性length
(速度较慢)。JS引擎可能足够智能,能够将i
简化为i
,这很可能是两种测试没有差异的原因。3.32
到3.49
不能被视为差异,特别是当你重复时,它会翻转。