js 循環 遍歷

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僅僅只是終止循環,后面的代碼會繼續執行。

  1. while - 當指定的條件為 true 時循環指定的代碼塊
  2. 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下都不兼容

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • 1、 map 返回一個新的數組,每個元素為調用func的結果, 不改變原數組let list = [1, 2, ...
    Rose_yang閱讀 206評論 0 0
  • 為了方便例子講解,現有數組和json對象如下 var demoArr = ['Javascript', 'Gulp...
    抓住時間的尾巴吧閱讀 981評論 0 1
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,264評論 0 4
  • 本文為原創文章,如需轉載請注明出處,謝謝! 當我老了,我還是會看書,慢慢的讀著,我不著急。 當我老了,我還是會愛花...
    momo521閱讀 275評論 0 2