JS支持不同類型的循環:
1. for - 循環代碼塊一定的次數
普通的for循環
for (語句 1; 語句 2; 語句 3)
{
// 被執行的代碼塊
}
語句 1 在循環(代碼塊)開始前執行
語句 2 定義運行循環(代碼塊)的條件
語句 3 在循環(代碼塊)已被執行之后執行
語句1/2/3都是可選的
關于for循環,有一下幾點需要注意
for循環中的i在循環結束之后任然存在與作用域中,為了避免影響作用域中的其他變量,使用函數自執行的方式將其隔離起來()();
避免使用for(var i=0; i<demoArr.length的方式,這樣的數組長度每次都被計算,效率低于上面的方式。也可以將變量聲明放在for的前面來執行,提高閱讀性。
跳出循環的方式有如下幾種:
return 函數執行被終止
break 循環被終止
continue 循環被跳過
for(j = 0; j < arr.length; j++) {
}
for(j = 0,len=arr.length; j < len; j++) {
}
// 使用臨時變量,將長度緩存起來,避免重復獲取數組長度,當數組較大時優化效果才會比較明顯。
***這種方法基本上是所有循環遍歷方法中性能最高的一種***
2. for/in - 循環遍歷對象的屬性
循環遍歷對象的屬性 || 循環遍歷數組的index
var person={fname:"John",lname:"Doe",age:25};
for (let key in person)
{
console.log(key )
}
結果:
fname
lname
age
var array=[1,2,3,4,5,6];
for(let index in array)
{
console.log(index );
}
結果:
0
1
2
3
4
5
for(var item in arr|obj){ } 可以用于遍歷數組和對象
遍歷數組時,item表示索引值, arr表示當前索引值對應的元素 arr[item]
遍歷對象時,item表示key值,arr表示key值對應的value值 obj[item]
關于for in,有以下幾點需要注意:
在for循環與for in循環中,i值都會在循環結束之后保留下來。因此使用函數自執行的方式避免。
使用return,break,continue跳出循環都與for循環一致,不過關于return需要注意
在函數體中,return表示函數執行終止,就算是循環外面的代碼,也不再繼續往下執行。而break僅僅只是終止循環,后面的代碼會繼續執行。
- while - 當指定的條件為 true 時循環指定的代碼塊
- do/while - 同樣當指定的條件為 true 時循環指定的代碼塊
while和do/while在循環時用得少,暫不詳細說明
3. $.each和$().each
在jquery中,遍歷對象和數組,經常會用到$().each和$.each(),兩個方法。兩個方法是有區別的,從而這兩個方法在針對不同的操作上,顯示了各自的特點。
$().each,對于這個方法,在dom處理上面用的較多。如果頁面有多個input標簽類型為checkbox,對于這時用$().each來處理多個checkbook,例如:
$(“input[name=’ch’]”).each(function(i){
if($(this).attr(‘checked’)==true)
{
//一些操作代碼
}
回調函數是可以傳遞參數,i就為遍歷的索引。
對于遍歷一個數組,用$.each()來處理,例如:
$.each([{“name”:”limeng”,”email”:”xfjylimeng”},{“name”:”hehe”,”email”:”xfjylimeng”},function(i,n)
{
alert(“索引:”+i,”對應值為:”+n.name);
});
參數i為遍歷索引值,n為當前的遍歷對象.
其實jQuery里的each方法是通過js里的call方法來實現的。
4.for of - ES6
這是最簡潔、最直接的遍歷數組元素的語法
這個方法避開了for-in循環的所有缺陷
與forEach()不同的是,它可以正確響應break、continue和return語句
for-of循環不僅支持數組,還支持大多數類數組對象,例如DOM [NodeList對象]
for-of循環也支持字符串遍歷,它將字符串視為一系列的Unicode字符來進行遍歷
for (var chr of "") {
alert(chr);
}
for (var word of uniqueWords) {
console.log(word);
}
for (var [key, value] of phoneBookMap) {
console.log(key + "'s phone number is: " + value);
}
5. Array的方法foreach - ES5
forEach和map都支持2個參數:一個是回調函數(item,index,list)和上下文
forEach:用來遍歷數組中的每一項;這個方法執行是沒有返回值的,對原來數組也沒有影響;
數組中有幾項,那么傳遞進去的匿名回調函數就需要執行幾次;
每一次執行匿名函數的時候,還給其傳遞了三個參數值:數組中的當前項item,當前項的索引index,原始數組input;
理論上這個方法是沒有返回值的,僅僅是遍歷數組中的每一項,不對原來數組進行修改;但是我們可以自己通過數組的索引來修改原來的數組;
forEach方法中的this是ary,匿名回調函數中的this默認是window;
var ary = [12,23,24,42,1];
var res = ary.forEach(function (item,index,input) {
input[index] = item*10;
console.log(this, 'this======');//--> Window {stop: ?, open: ?, alert: ?, confirm: ?, prompt: ?, …} "this======"
})
console.log(res);//-->undefined;
console.log(ary);//-->會對原來的數組產生改變; [120, 230, 240, 420, 10]
參數
callback => 為數組中每個元素執行的函數,該函數接收三個參數:
currentValue(當前值) => 數組中正在處理的當前元素。
index(索引) => 數組中正在處理的當前元素的索引。
array => forEach()方法正在操作的數組。
thisArg => 可選 可選參數。當執行回調 函數時用作this的值(參考對象)。
返回值 => undefined
6. map
map:和forEach非常相似,都是用來遍歷數組中的每一項;
區別:map的回調函數中支持return返回值;return的是啥,相當于把數組中的這一項變為啥(并不影響原來的數組,只是相當于把原數組克隆一份,把克隆的這一份的數組中的對應項改變了);
不管是forEach還是map 都支持第二個參數值,第二個參數的意思是把匿名回調函數中的this進行修改。
var ary = [12,23,24,42,1];
var res = ary.map(function (item,index,input) {
return item*10;
})
console.log(res);//-->[120,230,240,420,10];
console.log(ary);//-->[12,23,24,42,1];
參數
callback => 為數組中每個元素執行的函數,該函數接收三個參數:
currentValue(當前值) => 數組中正在處理的當前元素。
index(索引) => 數組中正在處理的當前元素的索引。
array => forEach()方法正在操作的數組。
thisArg => 可選 可選參數。當執行回調 函數時用作this的值(參考對象)。
返回值 => 一個新數組,每個元素都是回調函數的結果。
不管是forEach還是map在IE6-8下都不兼容