JavaScript 使用 if 進行邏輯判斷、for 進行迴圈與控制

9.1: 邏輯判斷式

其實前一章的布林值變數型別裡面我們就曾經講到邏輯判斷了,就是透過底下的方式來取得邏輯判斷的回傳值為 true 或 false

var logic1 = ( bmi > 24 );

此時 logic1 只會取得 true 或 false 這種布林值型別的值而已。所以說,邏輯運算就是答案為『 true 』或『 false 』的運算啊! 一般的邏輯運算式,大致是這樣的:

變數或常數  關係運算  變數或常數
   A          >        15
   B          <=       12

變數或常數  等於運算  變數或常數
   S          ==       Q
   Y          !=       Q

你可以看到關係運算主要就是大於等於小於之類的符號,至於驚嘆號 (!) 有『不是、反向』選擇的意思,這些運算都只會回傳 true 或 false 喔! 因為是邏輯運算啊!


複合邏輯計算

如果要同時滿足兩個以上的條件才邏輯判斷為真,那就是我們以前學數學所謂的 and 囉!如果是兩個條件的任何一個成立時,就會回傳值為真, 那就是 or 囉!例如前一章提到的 BMI 計算結果:

var bmi;
( bmi > 18.5 ) && ( bmi < 24 )    // BMI 需要同時大於 18.5 與小於 24 才是真
( bmi < 18.5 ) || ( bmi > 24 )    // BMI 小於 18.5 或者是大於 24 都可接受為真

所以,這個時候 && 以及 || 的協助就非常重要了!另外,邏輯判斷完畢之後,當然重點就是得要設計『當回傳 true 時,要進行什麼事? 而當回傳 false 時,則是進行另外的什麼事』這樣。那如何設計這方面的程式呢?這時最好先要有流程圖的概念:

9.2: 使用 if 進行條件判斷

使用 if 進行邏輯判斷,主要的語法是這樣的:

if  (邏輯判斷) {
	// 當回答為 true 時的工作
	...
}

但是,總有邏輯判斷總有真假吧?所以,如果真假兩件事分別依據邏輯判斷回應值而進行的話,就會變這樣:

if  (邏輯判斷) {
	// 當回答為 true 時的工作
	程式碼...
} else {
	// 當回答為 false 時的工作
	程式碼...
}

那如果有多個選項呢?基本上可以透過多重邏輯判斷的,例如:

if  (邏輯判斷-1) {
	// 當邏輯判斷-1 回答為 true 時的工作
	程式碼...
} else if (邏輯判斷-2) {
	// 當邏輯判斷-2 回答為 true 時的工作
	程式碼...
} else {
	// 當邏輯判斷-1 與 邏輯判斷-2 回答都是 false 時的工作
	程式碼...
}
例題 9-2-1:回答 BMI 數值的意義
  1. 建立 unit09-2-1.html 檔案。
  2. 使用 這個檔案 的內容貼上 unit09-2-1.html 當中。
  3. 如同檔案內的設定,建立 ansbmi 函數,並且同時判斷兩個同時成立的邏輯運算 (&&),亦即 bmi >=18.5 與 bmi <=24 的情況:
    • 若回傳為 true 時,顯示訊息 (可以設定一個變數處理) 為:『體重狀態很優良啊!』
    • 若回傳為 false 時,顯示訊息為:『體重的狀態不是很好喔!』

若只有真與假,那使用 if () {} else {} 即可,但如果一個判斷裡面有多種狀態呢?例如上面 BMI 的案例中,如果有體重過輕 ( BMI < 18.5)、 體重優良 (18.5 ≤ BMI < 24)、體重稍重 (24 ≤ BMI < 28) 與肥胖 (28 ≤ BMI)等,那處理的方案就得要使用多重狀態, 亦即增上多個 else if 即可喔!

例題 9-2-2:回答 BMI 數值的意義
  1. 將 unit09-2-1.html 另存新檔成為 unit09-2-2.html,並且在index.html 裡面加上相關的超連結,target 指向 js 視窗。
  2. 透過 if ... else if 的功能,將回傳的訊息增加為 4 種狀態,亦即過輕、正常、稍重與肥胖。


使用 if 設計 UI 界面

假設我們需要計算面積,而且需要依據不同的形狀來提供使用者輸入的資訊,這該如何設計?最簡單,就是將所有需要出現的, 通通給它放上來即可。問題是,這樣對於使用者的提示來說,好像有點混亂。

所以,我們是否能夠依據使用者點選不同的面積時,才出現所需要的 input 資訊?然後提供計算的結果呢? 似乎可以透過 if 的方式,當使用者點選相關的形狀後,再來使用 innerHTML 處理吧!設計看看:

例題 9-2-3:使用 if 設計簡單的 UI
  1. 建立 unit09-2-3.html 檔案。
  2. 使用 這個檔案 的內容貼上 unit09-2-3.html 當中,並且先查看應用一下該網頁。
  3. 先增加 label 的功能,讓使用者點選形狀的字體時,也能夠勾選單選項目。
  4. 將兩個數值的 input 取消,然後增加兩個 div,其 id 分別為 inp1 與 inp2 好了, 這兩個 div 是預計作為等等是否需要有兩個輸入框的預留環境
  5. 開始設計 myselect() 函數:
    • 由於我們的 form 使用了 myform 為 id,因此先設定一個變數名稱為 myform ,並且用以取得 id 為 myform 的表單元素。
    • 設計一個名為 myselect 的變數,內容為 myform.sel.value 這個單選資料 (請注意 form 大部分只對 input 有父、子關係!
    • 分別設計兩變數,分別是 inp1, inp2,分別取得 inp1 與 inp2 這兩個 id 的元素資訊
    • 判斷 myselect 是否為 1, 2, 3 等不同的數據,根據不同的數據來填寫 inp1.innerHTML 與 inp2.innerHTML, 就可以處理不同形狀的輸入框了。
    • 設計完成之後,當你點選不同的形狀時,畫面應該會出現相對應的輸入框才對,如下所示:
  6. 開始設計 mycal() 函數:
    • 一樣設計 myform 變數,取得 myform 頂層表單元素
    • 一樣設計 myselect 變數,內容為 myform.sel.value 即可。
    • 當 myselect == "1" 時,將 myform.num1.value 轉為數值後,使用 πr2 計算面積
    • 當 myselect == "2" 時,將 myform.num{1|2}.value 轉為數值後,使用 (1/2底*高) 計算面積
    • 當 myselect == "3" 時,將 myform.num{1|2}.value 轉為數值後,使用 (長*寬) 計算面積
    • 將計算完畢的面積丟入 myform.ans.value 當中。

9.3: 使用 for 進行迴圈設計

某些時刻我們需要『重複』進行某件事情,如果你重複兩三次程式碼,可能還覺得沒什麼了不起,但是,如果你需要的是幾十次、幾百次重複的程式碼,並且需要 (1)指定固定的次數或者是 (2)需要某個情境下才結束(或開始)某個持續不斷的程式碼,這個時候,你不能使用撰寫多次程式碼的方式, 而是需要透過『使用迴圈來執行某些個特定的程式碼』,這樣的想法才合理。例如底下的流程:



你可以發現圖示的箭頭中,當某條件持續成立時,就會持續不斷的運作右側的程式,直到條件失敗為止,這就是迴圈了。 JavaScript 通常可以使用兩種方式來執行迴圈,分別是:

我們先來介紹簡單的 for 迴圈,for 迴圈的基本語法有點像底下這樣:

for ( 變數初始值; 條件運算式; 變數變化步階) {
	procedure ...
	...;
}

// 例如底下的範例,從 0 到 99 之間的執行順序
var i;
for ( i = 0; i < 100; i++ ) {
	....
}
例題 9-3-1:用for迴圈列出 1 ~ 10
  1. 建立名為 unit09-3-1.html 的新檔。
  2. 設計名為num(),該函數主要製作 for迴圈列出1 ~ 10


巢狀迴圈設計

有很多時候,迴圈不是一層而已,可能迴圈裡面還有迴圈,這就是雙層迴圈啦!那麼如何測試雙層迴圈呢?最簡單的方法,就是透過製作 9X9 乘法表啦! 因為 9X9 乘法表,就得要透過兩層 1~9 的互相乘法來處理才行啊!

例題 9-3-2:使用巢狀迴圈處理 9X9 乘法表
  1. 新建檔案 unit09-3-2.html。
  2. 這個檔案內容 放入 unit09-3-2.html 檔案內,並且觀察一下檔案的樣式
  3. 設計名為 go99() 的函數,這個函數會使用到兩層迴圈:
    • 第一層迴圈使用 i 從 2 到 9 (因為 1 不太需要理他) 設計
    • 第二層迴圈使用 j 從 1 到 9 設計,並且在第二層迴圈使用如下的方式指定訊息累加:
      res=res+i+ " x " + j + " = " + (i*j) + "<br />";
  4. 將 res 的結果丟進 div 的內部 HTML 環境下。

上面的案例只是將結果列出來而已~顯示的效果當然是很糟糕!如果你將每個第一層迴圈的開始與結束,都加上 div 的話,那麼就能夠隔出 8 個 div 了! 同時,將 div 加入 display: inline-block 的話,就能夠處理的比較完美!請依據這個想法,設計出 9-3-3.html 的內容。

例題 9-3-3:加上一點點 UI 的設計
  1. 將 unit09-3-2.html 另存為 unit09-3-3.html。
  2. 如上的說明,請加入 div 的樣式,同時自己處理 CSS 的樣式表,看看情況會變如何!


資料來源
鳥哥上課教材資料: