在很多語言都會周遊數組,在js中也是如此,最常見的莫過于下面這種:
let a = ['x','y','z'];for(let i=0;i
定義變量i,然後讓這個變量作自+1操作,知道這個變量小于數組的長度。然後根據下标擷取數組中的每個值。
相對于上面這種,我們可以對數組進行for-in循環:
let a = ['x','y','z'];for(let i in a){ console.log(a[i])}
for-in是對object作周遊時用到的。由于array繼承自object,是以數組也可以進行for-in循環,注意for-in循環的左值為數組的下标。
還有一個類似的處理為for-of循環,
let a = ['x','y','z'];for(let i of a){ console.log(i);}
但是for-of循環的話對數組可以使用,但是對object執行個體使用時會報錯。
let b = { x:'x', y:'y', z:'z'}for(let i of b){ console.log(i);// TypeError: b is not iterable}
可以猜想for-of循環本身是應用在疊代器iterable類,但是數組為什麼也是可以用的!!!,注意for-of循環的左值為數組value值。
還有2種源自Array的構造器函數的原型:
let a = ['x','y','z'];a.forEach((_a,i)=>{ console.log(_a,i);})a.map((_a,i)=>{ console.log(_a,i);})
forEach方法和map方法都是數組原型上的方法,參數都是一個函數(下面稱為回調函數),并且這個函數傳入2個參數(value,key),我們可以在這個函數内部對數組進行循環周遊操作。那為什麼要在原型上添加兩個一樣的方法呢??
其實從定義的方法明我們可以看到這兩個方法應該是有差別的:
let a = ['x','y','z'];console.log(a.forEach((_a,i)=>_a))//undefinedconsole.log(a.map((_a,i)=>_a))//["x