循環是所有編程語言中最為重要的機制之一,幾乎任何擁有實際意義的計算機程序(排序、查詢等)都里不開循環。 而循環也正是程序優化中非常讓人頭疼的一環,我們往往需要不斷去優化程序的復雜度,卻因循環而糾結在時間復雜度和空間復雜度之間的抉擇。
在 javascript 中,有3種原生循環,for () {}, while () {}和do {} while (),其中最為常用的要數for () {}。
然而for正是 javascript 工程師們在優化程序時最容易忽略的一種循環。
我們先來回顧一下for的基本知識。
javascript 的for語法繼承自c語言,for循環的基本語法有兩種使用方法。
1. 循環數組
for循環的基本語法
我們以一段實例代碼來進行詳細說明。
for (var i = 0, len = array.length; i < len; ++i) {
sum += array[i];
}
console.log('The sum of the array/'s items is %d.', sum);
//=> The sum of the array's items is 15.
在這段代碼中,我們首先定義并初始化了一個用存儲待累加項的數組和一個總和整形變量。 接下來,我們開始進行循環。在該for循環的初始化代碼中,我們也定義并初始化了兩個變量: i(計數器)和len(循環數組長度的別名),當i小於len時,循環條件成立,執行邏輯代碼;每次邏輯代碼執行完畢以后,i自增1。
在循環的邏輯代碼中,我們把當前循環的數組項加到總和變量中。
這個循環用流程圖表示為如下:
從這個流程圖中我們不難發現,程序中真正的循環體不僅有我們的邏輯代碼,還包含了實現循環自身的執行判斷和循環處理。
這樣,我們的優化思路就清晰了,我們可以從四個方面進行優化。
1.循環體前的初始化代碼
2.循環體中的執行判斷條件
3.邏輯代碼
4.邏輯代碼后的處理代碼
ps: 其中第一點和第二點存在重要關系。
1.1 優化初始化代碼和執行判斷條件
我們先來看看一段大家都非常熟悉的代碼。