JS中絕大多數(shù)的for循環(huán)都會和指定數(shù)組長度(array.length)打交道,將數(shù)組長度(array.length)緩存至變量里可以在每次for循環(huán)判斷時直接獲取數(shù)組的長度左医,而不是每次判斷時都重新計(jì)算一遍瓷产,從而達(dá)到節(jié)省資源的目的票从。
// 不緩存
for (var i = 0; i < arr.length; i++) {
//代碼
}
// 緩存
var len = arr.length;
for (var i = 0; i < len; i++) {
//代碼
}
可這個小小的優(yōu)化措施對于性能的提升到底如何篡帕?
直接上圖:
從圖中可以看出緩存length屬性的話,對性能的確是有小幅度提升的栅隐,可是在使用了v8引擎的瀏覽器中(google chrome),由于v8引擎的Loop-invariant code motion特性膘侮,循環(huán)體中那些不會發(fā)生變化的語句將會被直接移到循環(huán)體外:
for (var i = 0; i < n; i++) {
x = y + z; a[i] = 6 * i + x * x;
}
將會在編譯時自動優(yōu)化成:
x = y + z;
t1 = x * x;
for (var i = 0; i < n; i++) {
a[i] = 6 * i + t1;
}
以優(yōu)化性能屈糊。
由于這個特性,即便沒有緩存length屬性琼了,由于length屬性不會隨著循環(huán)次數(shù)的增多而變化逻锐,length屬性會被自動移到循環(huán)體外并緩存起來(僅限使用了v8引擎的chrome瀏覽器),所以是否多寫一行代碼來緩存length屬性雕薪,并不會影響到chrome瀏覽器對于array.length的優(yōu)化昧诱,至于非v8的主流瀏覽器(特別是ie),緩存length屬性對于性能還是有比較客觀的提升的。