【发布时间】:2026-01-16 21:20:04
【问题描述】:
我正在浏览,我found this:
var i, len;
for(i = 0, len = array.length; i < len; i++) {
//...
}
我的第一个想法是:
- 他为什么这样做? (由于某种原因它必须更好)
- 值得吗? (我想是的,否则他为什么会这样做?)
正常循环(不缓存长度的循环)是否每次都检查array.length?
【问题讨论】:
-
在不编译代码的旧浏览器中缓存长度可能更重要。如果我记得的话,Chrome 很好地优化了这一点。
-
@RightSaidFred - Chrome 不会优化它,因为它不能(长度可以在循环内改变),但它足够快,两种方式都没有很大的速度差异。
-
@jfriend00:因为是编译后的代码,看来Chrome可以知道Array是否在循环中被修改,如果没有则进行优化。但我当然同意,对于 Chrome,这基本上是一个有争议的问题。
-
@RightSaidFred - 也许如果循环中没有函数调用,循环中没有带有访问器的属性,并且循环中没有调用数组上的方法,等等......但是,这很难JS 知道什么可能会或可能不会间接修改数组的长度。我认为 Chrome 的速度已经足够快,以至于这些类型的优化不会像以前那样产生太大的影响。
-
@jfriend00:是的,我完全听到你在说什么。我经常想知道 Chrome 能够在多大程度上遵循代码并进行优化。有几次我通过 Google Closure Compiler 中的高级优化运行代码,我对它解开的代码感到非常惊讶。不知道它是如何发挥作用的。
标签: javascript arrays