【1】for循環(huán)
for (語句 1; 語句 2; 語句 3)
{
//被執(zhí)行的代碼塊
}
語句 1 在循環(huán)(代碼塊)開始前執(zhí)行
語句 2 定義運行循環(huán)(代碼塊)的條件
語句 3 在循環(huán)(代碼塊)已被執(zhí)行之后執(zhí)行
//實例:
for(var i=0;i<li.length;i++){
// do something
}
【2】for...in循環(huán)遍歷
var arr=["a","b","c"]
arr.name="wayne"
for(let i in arr){
console.log(arr[i])
}
(1)for..in實際遍歷的是對象的屬性拣播,當(dāng)循環(huán)遍歷的目標(biāo)是數(shù)組時則被他當(dāng)成一個對象,每個數(shù)組元素的索引被視為一個屬性0:a,1:b,2:c,name:wayne;所以abc和wayne都被遍歷出來了(但不包括Array的length屬性)
(2)for...in 其中i是索引數(shù)組下標(biāo)
(3)既可以遍歷數(shù)組又可以遍歷對象
【3】for...of循環(huán)遍歷
var arr=["a","b","c"]
arr.name="wayne"
for(let i of arr){
console.log(i)
}
(1)for … of循環(huán)則修復(fù)for...in的一些問題拯刁,它只循環(huán)集合本身的元素,所以只輸出abc不輸出wayne
(2)for...of是es6出來的逝段,只用于遍歷數(shù)組垛玻,其中i是元素;
(3)for...of 不可以遍歷對象奶躯,會報錯,因為能夠被for...of正常遍歷的帚桩,都需要實現(xiàn)一個遍歷器Iterator。而數(shù)組嘹黔、字符串朗儒、Set、Map結(jié)構(gòu)参淹,早就內(nèi)置好了Iterator(迭代器)醉锄,它們的原型中都有一個Symbol.iterator方法,而Object對象并沒有實現(xiàn)這個接口浙值,使得它無法被for...of遍歷恳不。
指路:特殊處理下for...of也可遍歷對象
【4】原生Js forEach()循環(huán)遍歷
var arr=["a","b","c"]
arr.name="wayne"
arr.forEach(function(item,index,arr){
console.log(item)
})
//箭頭函數(shù)
arr.forEach((item,index,arr)=>{
console.log(item);
});
【5】原生Js map()循環(huán)遍歷
var arr=["a","b","c"]
arr.name="wayne"
arr.map(function(item,index,arr){
console.log(item)
return item
})
forEach()和 map() 相同點:
(1)只能循環(huán)遍歷數(shù)組,遍歷對象報錯forEach/map is not a function
(2)forEach() 和 map() 里面每一次執(zhí)行匿名函數(shù)都支持3個參數(shù):數(shù)組中當(dāng)前項item,當(dāng)前項的索引index,原始數(shù)組arr开呐。
(3)匿名函數(shù)中的this都是指Window烟勋。
forEach()和 map() 不同點:
(1)forEach() 沒有返回值;map() 有返回值筐付,可以return 出來卵惦。
【總結(jié)】
這么多循環(huán),肯定會有疑問瓦戚,什么時候用哪個沮尿?用哪個性能更好?
首先明確一點哪個快和應(yīng)該用哪個较解,并不應(yīng)該劃等號畜疾。如果你真的需要考慮性能,或者有 break 的需求印衔,就用 for 吧啡捶。但是如果真的到了這一步,你應(yīng)該不會對性能這個問題有所顧慮奸焙。
所以最后總結(jié)就是:
【1】遍歷對象用for...in(數(shù)組也可以用實際還是把數(shù)組當(dāng)成對象去遍歷)
【2】簡單遍歷數(shù)組用for或forEach或for of
【3】需要將數(shù)組按照某種規(guī)則映射為另一個數(shù)組就應(yīng)該用map()