---
tags: 投稿文章
---
![image](https://i.imgur.com/Gff1Iow.png)
# JavaScript 的大名鼎鼎 for 迴圈
## for 迴圈
到了這一個章節我個人感到相當的高興,因為當初在台大的 Python 課程時,我就是在這一個環節徹底陣亡,雖然當時沒有學好,但至少還是有一點點基礎,也了解到程式語言果然是共通的,頂多是寫法不同而已。
回想六個月前,`for (var i = 0; i < 3; i++)`,這一小段對我來說根本天書阿,`i` 為什麼總是等於`0`,還有到底什麼是`i++`,現在想起來當時的自己竟然糾結在這個地方這麼久,不免覺得可笑阿!
### for 寫法
* 先來一個最簡單的起手式,請瞧瞧以下程式碼。
```js=
for ( var i = 0; i < 5; i++ ){
console.log(i);
}
// console 顯示 0
// console 顯示 1
// console 顯示 2
// console 顯示 3
// console 顯示 4
```
我們用 `for` 迴圈的方式讓 console 分別顯示 `1~5`,`for` 的寫法是這個樣子,`for (){}`,`()` 內是 `for` 要迭代的內容,而 `{}` 則是要執行的程式。
而 `for ( var i = 0; i < 5; i++)` 的意思,是 `for` 要迭代的內容為 `(var i = 0; i < 5; i++)`,這個 `()` 內的意思為,宣告一個變數為 `i` 且 `i=0`,這就是指迭代的起點,再來用分號 `;` 隔開,後接 `i < 5`,這的意思是說迭代至哪裡為止,也就是終點,再來繼續用一個分號 `;` 隔開,後接 `i++`,這個指的意思就是 `i=i+1`,所以 `i` 每一次重新迭代以後都被加了 `1`,這就是 `()` 內,跌帶內容的意思。
然後 `{}` 內要執行的內容為 `console.log(i);`,就是分別地顯示 `i` 就是了,所以 console 就依序的顯示了 `0、1、2、3、4` 了,是不是不難呀,就是這麼簡單呢。
* 若是稍稍的複雜一點呢,來個九九乘法表吧
```js=
for (var i = 2; i < 4; i++){
for (var j = 1; j <10; j++){
console.log(i+'*'+j+'='+i*j);
}
}
console 顯示 2*1=2
console 顯示 2*2=4
console 顯示 2*3=6
console 顯示 2*4=8
console 顯示 2*5=10
console 顯示 2*6=12
console 顯示 2*7=14
console 顯示 2*8=16
console 顯示 2*9=18
console 顯示 3*1=3
console 顯示 3*2=6
console 顯示 3*3=9
console 顯示 3*4=12
console 顯示 3*5=15
console 顯示 3*6=18
console 顯示 3*7=21
console 顯示 3*8=24
console 顯示 3*9=27
```
竟然出現了兩個 `for`,不是說稍微複雜一點嗎?這樣會不會有點複雜太多了呢?不會不會的,我們靜下心來好好看就好。
今天我們想要呈現一個 `a*b=c` 的九九乘法表 (2 的倍數與 3 的倍數),`a` 是被乘數,`b` 是乘數,`c` 是積(小五數學),所以 `a` 與 `b` 是需要被置換的變數值,在程式中我們用 `i` 與 `j` 來表示 `a` 與 `b`,首先第一個 `for (var i = 2; i < 4; i++)`,`i` 從 `2` 開始止於 `3`,當第一個 `i = 2` 開始迭代進去時,就進入到了第二個 `for (var j = 1; j <10; j++)`,`j` 從 `1` 開始止於 `9`,再進入下一層的 `console.log(i+'*'+j+'='+i*j);`,此時 `i` 仍為 `2`,但 `j` 卻從 `1` 開始被迭代到了 `9`,所以 console 依序的顯示了 `2*1=2` ~ `2*9=18`,當 `j = 9` 結束時,程式從第二個 `for` 跳出回到第一個 `for`,此時 `i = 2` 也結束了,開始進入到 `i = 3`,接著又進去第二個 `for`,`j` 又開始從 `1` 迭代至 `9`,所以 console 接續顯示 `3*1=3` ~ `3*9=27`,此時程式結束,跳出。
### 如何用 for 迴圈依序取用物件內的資料
之前我們曾經介紹過陣列物件是如何存取物件的,現在我們要搭配 `for` 迴圈的寫法,來依序取出再物件裡的資料,請看下面的程式碼。
```js=
var house = [
{
person: 'Alec',
pets: ['小蜜', '波比']
},
{
person: 'Eason',
pets: ['吉利', '寶寶']
}
];
for (var i = 0; i < house.length; i++){
console.log('第' + (i+1)
+'個家的主人是 '
+ house[i].person
+',他的寵物叫'
+house[i].pets[0]
+'與'
+house[i].pets[1]);
}
// console 顯示'第1個家的主人是 Alec,他的寵物叫小蜜與波比'
// console 顯示'第2個家的主人是 Eason,他的寵物叫吉利與寶寶'
```
首先我們建立了 `var house` 的內容,`var house` 內是一個物件資料,分別記載了兩組陣列,而我們先來一個 `for` 迴圈起手式 `for (var i = 0; i < house.length; i++)`,其中 `house.length` 的意思就是計算 `var house` 內到底有幾組資料,也就是我們的 `i` 要迭代幾次的意思,在這個範例裡 `house.length`的值會等於 `2`,後面的 `console.log` 內,我們就組了一個字串,其中 `house[i].person`,就會依序地讀取出 `person` 的值,而 `house[i].pets[0]` 與 `house[i].pets[1]`,則依序讀出了 `pets` 的值,當 `i = 0` 時,就會將第一組陣列的資料帶入 (Alec組),所以 console 就顯示了 `第1個家的主人是 Alec,他的寵物叫小蜜與波比`,而 `i = 1`時,第二組陣列 (Eason) 組就會被帶入,所以 console 就顯示了 `第2個家的主人是 Eason,他的寵物叫吉利與寶寶`。
### 若是我們只要撈出來物件中的部分資料而已怎麼辦,這時候就需要 for 搭配 if 了
```js=
var companies = [
{
boss:'Alec',
staff:50,
asset:20000000
},
{
boss:'Rita',
staff:150,
asset:12000000
},
{
boss:'Eason',
staff:500,
asset:400000000
}
];
// Question:請問誰的公司員工數量超過 200 位以上?
for (i = 0 ; i < companies.length ; i++){
if(companies[i].staff > 200){
console.log(companies[i].boss
+' 的公司員工超過 200 位以上');
}else{
console.log('沒有公司符合這個條件');
}
}
// console 顯示 'Eason的員工超過200位以上'
//Question:請問誰的公司員工數量少於 120 位,並且資產超過 15000000 元?
for (i = 0 ; i < companies.length ; i++){
if(companies[i].staff < 120
&& companies[i].asset >15000000){
console.log(companies[i].boss
+' 的公司員工少於 120 位並且公司資產超過 15000000 元');
}else{
console.log('沒有公司符合這個條件');
}
}
// console 顯示 'Alec 的員工少於 200 位並且公司資產超過 15000000 元
```
一樣的,我們先 `var comapnies` 一個物件資料,裡面紀錄了三間公司的資訊,老闆、員工數及資產,今天我們提出了兩個問題。
* 第一個問題是:請問誰的公司員工數量超過 200 位以上?
透過 `for` 迴圈加上 `if`,我們可以從物件中撈出答案來,仍然先來一個 `for (i = 0 ; i < companies.length ; i++)` 起手式,再來後接`if` 條件式,條件是什麼呢?這個條件 `(companies[i].staff > 200)`,用 `companies[i].staff` 撈出每一間公司的 staff 數量一一比對是否有大於 200,若有即符合,便可執行後續程式 `console.log(companies[i].boss+' 的公司員工超過 200 位以上');`,若都無符合此條件的話,`else{console.log('沒有公司符合這個條件');}`,就會顯示 `沒有公司符合這個條件` 的文字,於是我們得到了答案,console 顯示 `Eason的員工超過200位以上`。
* 第二個問題是:請問誰的公司員工數量少於 120 位,並且資產超過 15000000 元?
這個問題只有 `if` 內的條件寫法不一樣,其他都一樣,條件改為 `(companies[i].staff < 120 && companies[i].asset >15000000)`,`companies[i].staff` 依序撈出每間公司的 staff 數量比對是否少於 120,並且 `companies[i].asset` 再撈出公司的資產,並一一比對是否大於 15000000,若這兩個條件均同時成立,就執行後續程式碼 `console.log(companies[i].boss +' 的公司員工少於 120 位並且公司資產超過 15000000 元');`,若都無符合此條件的話,`else{console.log('沒有公司符合這個條件');}`,就會顯示 `沒有公司符合這個條件` 的文字,所以我們得到了答案,console 顯示 `Alec 的員工少於 200 位並且公司資產超過 15000000 元`。
### 利用 for 來加總數量
利用 `for` 迴圈,我們還可以逐一的加總裡面的數量來做統計,現在我們利用同一份物件資料來做計算。
```js=
var companies = [
{
boss:'Alec',
staff:50,
asset:20000000
},
{
boss:'Rita',
staff:150,
asset:12000000
},
{
boss:'Eason',
staff:500,
asset:400000000
}
];
// Question:請問這三間公司的員工合計是多少?
var staffTotal = 0;
for (i = 0; i < companies.length; i++){
staffTotal += companies[i].staff;
}
console.log('這 ' + companies.length + ' 間公司的員工數量合計為 '+ staffTotal + ' 位');
// console 顯示 '這 3 間公司的員工數量合計為 700 位'
```
* 問題:請問這三間公司的員工合計是多少?
我們先 `var staffTotal = 0` 這個變數,是要給三間公司合計用的,先給他一個起始值為 `0`,然後開始我們的 `for` 迴圈,`for (i = 0; i < companies.length; i++)`,再來將 `staffTotal` 逐一的加總起來,`staffTotal += companies[i].staff;`,這裡要解釋一下 `+=` 是甚麼意思?
> x += y → x = x+y (簡單來說就是,新的 x 是舊的 x 加上 y 的值的意思)
>
所以當放進 `for` 迴圈內時,`+=` 可以逐一的累加,讓變數一直成為新的值,`staffTotal += companies[i].staff;`,`staffTotal` 原本是`0`,透過 `+=` 並且用 `companies[i].staff;` 將值依序取出並且加上,最後 `staffTotal` 就變成了 (50+150+500=700),最後用 `console.log` 組一個字串,console 就顯示`這 3 間公司的員工數量合計為 700 位` 了。
### for 與 break 的結合
有時候,我們不想要 `for` 迴圈全部跑完,當它滿足了條件以後,我們就想要他停止運行後面的程式直接跳出,這時就可以搭配 `break`來應用。
```js=
var loanList = [
{
bankName:'匯豐銀行',
interestRate:0.04,
quota:2000
},
{
bankName:'星展銀行',
interestRate:0.02,
quota:1500
},
{
bankName:'花旗銀行',
interestRate:0.03,
quota:1800
}
];
// Question:今天想要和銀行貸款 1600 萬元,請問這三間銀行,哪一個額度足夠並且利率最低呢?
for (var i = 0; i < loanList.length; i++){
if (loanList[i].quota > 1600){
console.log(loanList[i].bankName + '的額度已足夠');
break;
}
}
// console 顯示 '匯豐銀行的額度已足夠'
```
* 問題:今天想要和銀行貸款 1600 萬元,請問這三間銀行,哪一個額度足夠呢?
當然,我們先 `var loanList` 了一個物件,內存了三間銀行的貸款資料,再來我們用 `for` 迴圈來一一比對,起手式在這裡 `for (var i = 0; i < loanList.length; i++)`,然後 `if` 的條件這麼下 `(loanList[i].quota > 1600)`,這樣就可以比對出哪一間銀行額度是足夠的了,再來我們組一個字串來顯示哪一間銀行額度足夠,我們用肉眼觀察可以發現匯豐銀行和花旗銀行的額度是足夠,但是我們只需要和一間銀行貸款就好,所以條件符合就可以不用找另外一間了,所以我們配合 `break` 語法放在最後面,這樣 console 就只會顯示 `匯豐銀行的額度已足夠` 了。
## 結語
以上就是今天介紹與說明的 JavaScript `for` 迴圈,謝謝大家。
## 參考資料
* 六角學院課程:JavaScript 入門篇 - 學徒的試煉