在寫程式時,我們經常需要根據變數的不同值,執行對應的程式碼區塊。
舉例來說,假如你正在寫一個天氣提示的應用程式,根據天氣類型提供不同的建議,可能會寫出以下的程式碼:
if (x == "rainy") {
console.log("Remember to bring an umbrella.");
} else if (x == "sunny") {
console.log("Dress lightly.");
} else if (x == "cloudy") {
console.log("Go outside.");
} else {
console.log("Unknown weather type!");
}這種 if...else if...else 結構 在條件比較少的時候很好用,但當條件變多,或每種情況要執行的程式碼越來越複雜時,就會變得:
✅ 冗長 — 一大串的 if 和 else if,不容易快速理解程式邏輯。
✅ 難維護 — 每當新增一個條件,你可能需要重新檢查每個分支的邏輯。
✅ 易出錯 — 當條件多時,少打了一個 else 或比對錯誤,可能會導致錯誤的程式執行路徑。
這時,switch 結構就成為另一種好選擇。
switch 結構的出現是為了什麼?
switch 的目的是提供一種更直接的語法,用來「比對變數值並指派對應動作」。它的語法非常適合:
✅ 當條件是單純的「等於某值」判斷。
✅ 當條件數量多,想讓程式碼更清楚易讀時。
✅ 當不同條件對應的動作彼此獨立時。
你可以把 switch 想成是「根據變數值選擇要執行哪條路線的交通指揮官」,每個 case 就是一條路,程式會依變數值決定該走哪一條。
switch 的基本語法
switch 結構的設計目的是用更直接的語法來達成「指派」或「選擇」行為。
它讓程式根據一個變數或表達式的值,選擇要執行哪段程式碼。相比一連串的 if...else if...else,switch 的結構更清楚、易讀。
範例程式碼
以下是一個用 switch 實作的範例,根據使用者輸入的天氣類型給出不同的建議:
switch (prompt("What is the weather like?")) {
case "rainy":
console.log("Remember to bring an umbrella.");
break;
case "sunny":
console.log("Dress lightly.");
break;
case "cloudy":
console.log("Go outside.");
break;
default:
console.log("Unknown weather type!");
break;
}在這段程式中,prompt 會顯示輸入框,要求使用者輸入天氣狀況,例如 "rainy"、"sunny" 或 "cloudy"。
詳細語法說明
switch 結構是用來根據某個表達式的結果值,對應執行不同程式碼區塊。
下面我們更深入地拆解它的每個部分。
switch (表達式)
switch 關鍵字後面接一對小括號,裡面放的是 要被比對的表達式。
程式會先計算出這個表達式的結果,然後拿這個結果去與每個 case 的值做嚴格相等(===)比對。
💡 這個表達式的結果是什麼都可以,只要是簡單值(數字、字串、布林值等),最常見的寫法有:
一個變數
當你已經有一個變數,想根據它的值執行不同邏輯:
let weather = "sunny";
switch (weather) {
case "rainy":
console.log("Bring an umbrella.");
break;
case "sunny":
console.log("Wear sunglasses.");
break;
}👉 這裡 weather 是表達式,程式會直接用它的值去比對每個 case。
一個函式的回傳值
如果你想當場取得一個值來比對,例如使用者的輸入:
switch (prompt("What is the weather like?")) {
case "rainy":
console.log("Bring an umbrella.");
break;
case "sunny":
console.log("Wear sunglasses.");
break;
}👉 prompt(...) 的回傳值會直接作為 switch 的表達式結果。
一個運算式
如果你想用運算的結果來比對:
let a = 2;
let b = 3;
switch (a + b) {
case 4:
console.log("Sum is 4.");
break;
case 5:
console.log("Sum is 5.");
break;
}👉 這裡 a + b 會先被計算,結果是 5,然後比對到 case 5。
小提醒
- 型別要一致!
switch用的是嚴格相等比對(===),所以如果表達式的結果是數字,case的值也必須是數字,不會自動轉型。 - 表達式結果應該簡單明確!
避免把太複雜的邏輯放在表達式裡,否則程式碼會變得不好維護。
很好,你希望這段更詳細、完整,我幫你擴寫得更適合初學者深入理解,並補充背景、邏輯與常見陷阱。
case 值:
在 switch 結構中,每個 case 就像是程式的「檢查站」。
程式會將 switch 表達式計算出的結果,一個一個去比對這些 case 的值。
一旦找到了符合的 case,程式就會 從該 case 開始執行程式碼,直到遇到 break 或到 switch 結尾。
基本範例
case "rainy":
console.log("Remember to bring an umbrella.");
break;當 switch 表達式的結果是 "rainy",程式就會執行 console.log(...),然後遇到 break 停止執行 switch 區塊。
case 的值可以是哪些型別?
case 的值必須是可以與 switch 表達式的結果比對的簡單型別,通常是:
- 字串(string)
case "sunny":- 數字(number)
case 1:- 布林值(boolean)
雖然少見,但語法允許:
case true:❗ 注意:
比對時會用嚴格相等(===),不會自動轉型!
例如:
switch ("1") {
case 1:
console.log("數字 1");
break;
default:
console.log("不是數字 1");
}👉 這會輸出「不是數字 1」,因為 "1"(字串)不等於 1(數字)。
多個 case 共用程式碼
有時候不同的 case 條件,執行的動作是一樣的。這時你可以不寫重複程式碼,而是讓多個 case 共用同一區塊:
case "rainy":
case "stormy":
console.log("Bring an umbrella.");
break;👉 不論表達式結果是 "rainy" 還是 "stormy",都會執行 console.log("Bring an umbrella.")。
💡 這種寫法很常見於條件很多但結果相同的場景,例如簡化選單、分類動作。
break;
break 是用來 中止當前的 case 處理並跳出 switch 結構 的。
如果漏寫 break 會怎樣?
如果在 case 的程式碼區塊最後漏寫 break,程式不會自動停止,而是會繼續執行下一個 case,這種行為稱作 fall-through(貫穿執行)。
例如:
switch ("sunny") {
case "sunny":
console.log("It's sunny today.");
case "cloudy":
console.log("It might rain.");
break;
}👉 這會印出:
It's sunny today.
It might rain.因為沒有 break,程式跑完 "sunny" 的程式碼後,直接繼續跑 "cloudy" 的程式碼。
使用 fall-through 的正確範例
雖然初學者通常應該避免不小心漏掉 break,但有時 fall-through 是有意為之:
switch (day) {
case 1: // Monday
case 2: // Tuesday
case 3: // Wednesday
case 4: // Thursday
case 5: // Friday
console.log("It's a weekday.");
break;
case 6: // Saturday
case 7: // Sunday
console.log("It's the weekend.");
break;
default:
console.log("Invalid day.");
break;
}👉 這裡故意讓多個 case 貫穿,以便不同數字都執行同樣的程式碼。
很好,你的要求讓這份教學更完整、更適合初學者。我幫你把 default 的說明寫得更詳細,補充背景、範例變化、常見問題與好習慣,讓讀者一看就懂!
default:
default 是 switch 結構中 最後的保險機制,當 所有 case 的條件都不符合時,程式會執行 default 區塊裡的程式碼。
你可以把它想像成:
- 在
if...else if...else裡的else。 - 當所有比對都沒命中時,提供一個「預設行為」或「錯誤處理」。
這讓你的程式在面對不預期的輸入時,也能穩定運作,給使用者明確的回應或處理。
範例
switch (prompt("What is the weather like?")) {
case "rainy":
console.log("Remember to bring an umbrella.");
break;
case "sunny":
console.log("Dress lightly.");
break;
case "cloudy":
console.log("Go outside.");
break;
default:
console.log("Unknown weather type!");
break;
}👉 在這段程式碼中:
- 如果使用者輸入
"rainy"、"sunny"或"cloudy",程式會執行對應的提示。 - 如果使用者輸入的是其他值(例如
"snowy"或"windy"),沒有任何case符合,程式就會執行default:
Unknown weather type!default 的位置
雖然大多數程式都把 default 寫在最後,這樣看起來邏輯更直觀,但實際上:
✅ default 可以放在 switch 裡的任何位置!
程式並不會因為 default 的位置不同而改變它的作用。只要沒有符合的 case,default 都會被執行。
👉 範例:
switch (value) {
default:
console.log("No match found");
break;
case 1:
console.log("One");
break;
case 2:
console.log("Two");
break;
}如果 value 是 1,程式還是會直接跳到 case 1,不會先跑 default。
如果 value 不是 1 或 2,才會執行 default。
💡 建議: 為了程式碼可讀性,還是把 default 放在最後,讓邏輯更直觀易懂。
default 是否需要 break?
✅ 技術上,default 可以不用 break,因為它通常放在最後,不會有後續的程式碼可貫穿。
但實務上,建議即使在 default 最後還是寫上 break:
default:
console.log("Unknown weather type!");
break;原因:
- 一致性:每個區塊的結尾看起來都一樣,方便維護。
- 未來修改安全:如果以後有人在
default後面加了新的case,沒有break可能會造成 fall-through 錯誤。
常見用途
在寫 switch 時,default 的常見應用包括:
- 顯示錯誤或警告訊息,提醒輸入值不合法。
- 設定一個預設的動作或回傳值。
- 記錄日誌方便除錯。
完整執行流程
當程式執行到 switch 結構時,會經歷以下步驟:
1️⃣ 先計算 switch 裡表達式的結果。
2️⃣ 從上到下比對每個 case 的值,找出第一個符合的。
3️⃣ 執行該 case 下的程式碼。
4️⃣ 執行到 break 或 switch 結構結束為止。
5️⃣ 如果沒有任何 case 符合,執行 default(如果有的話)。
flowchart TD
A[開始] --> B[計算表達式值]
B --> C{檢查 case 1}
C -->|符合| D[執行 case 1]
C -->|不符合| E{檢查 case 2}
E -->|符合| F[執行 case 2]
E -->|不符合| G{檢查 case 3}
G -->|符合| H[執行 case 3]
G -->|不符合| I{有 default?}
D --> J{有 break?}
F --> K{有 break?}
H --> L{有 break?}
J -->|是| M[結束]
J -->|否| F
K -->|是| M
K -->|否| H
L -->|是| M
L -->|否| N[繼續執行]
I -->|是| O[執行 default]
I -->|否| M
O --> M
N --> M
style A fill:#e1f5fe
style B fill:#f3e5f5
style M fill:#e8f5e8switch 與 if...else 的比較
在程式設計中,switch 和 if...else 都可以用來根據條件執行不同程式碼區塊,但它們適合的場景與優缺點不同。以下是兩者的詳細比較:
| 特點 | switch | if...else |
|---|---|---|
| 可讀性 | 高 — 當條件是簡單相等判斷時(例如字串或數字),程式碼結構清楚,容易理解每個條件的對應行為。 | 當條件較少時可讀性還不錯,但若條件很多或嵌套過深,程式碼會顯得冗長、邏輯難以追蹤。 |
| 靈活度 | 只能比較「相等」的情況(嚴格相等,===),無法直接寫範圍、複雜邏輯或多重條件運算。 | 靈活度高,可處理範圍判斷、邏輯運算(例如 x > 10 && x < 20)、型別判斷等複雜條件。 |
| 維護性 | 高 — 新增或修改條件時,只需新增一個 case,其他不受影響。條件排列也不會影響邏輯正確性(因為是比對值)。 | 較低 — 新增條件時需特別留意條件順序和邏輯正確性,否則可能影響後續分支的判斷。 |
| 表達力 | 適合條件固定、選擇明確的情境(例如選單、代號判別、狀態比對)。 | 適合條件多變、邏輯較複雜的情境(例如數值範圍、型別或多層巢狀邏輯)。 |
| 執行效率(微小差異) | 大多數情況下和 if...else 差不多,但當條件非常多時,有些編譯器對 switch 可以優化成查表形式。 | 執行速度一般與 switch 類似,但過多的 else if 會逐一比對,可能效率略低(差異通常很小)。 |
適用場景比較
使用 switch 的好時機:
✅ 當條件是單一變數的相等比對,例如:
switch (command) {
case "start":
case "stop":
case "pause":
// 對應指令的動作
}✅ 當條件值明確、數量多,想讓程式碼更整齊時。
✅ 當不同條件對應獨立動作,且邏輯彼此無關。
使用 if...else 的好時機:
✅ 當條件是範圍、邏輯運算:
if (score >= 90) {
console.log("A");
} else if (score >= 80) {
console.log("B");
}✅ 當需要比對多重條件(例如兩個變數的組合):
if (x > 0 && y > 0) {
console.log("第一象限");
}✅ 當條件間有順序性或互斥邏輯,需要一層層檢查時。
小提醒
💡 switch 和 if...else 可以互補使用。
有時在主要邏輯用 switch,在某些分支內用 if 判斷更細的情況,也是常見寫法。
💡 選擇適合的語法,讓程式更清楚、可維護,遠比硬套其中一種來得重要。
結語
switch 是一種適合在變數值範圍明確、條件固定的情況下使用的語法結構。它可以讓程式碼更簡潔、可讀性更高。
不過,也要特別留意 break 的使用,避免程式執行了不希望執行的區塊。
當你熟練掌握 switch,將能更靈活地選擇何時該用 switch,何時該用 if...else,寫出更清楚易懂的程式碼。