---
# System prepended metadata

title: if 與 switch 的使用時機？

---

> 如果有記憶吐司就好了...
# if 與 switch 的使用時機？

身為JS條件判斷的兩大語法,雖然兩者基本上可以做到相同的作用,但是卻有著值得我們去探討的差異,讓我們來比較看看這兩者的差別吧!
### 語法差異
* **if else:** 當條件成立的時候會執行其陳述式裡的程式，而不成立時則執行另外一個陳述式。
> if else是將整個要判斷的內容放在條件式，其條件式是使用布林值作為判斷基礎,若第一個條件式不成立就會往下一個執行,若條件式成立就執行該區塊的結果,若不成立就會一直執行最後面else的結果。*
* **switch case:** 括號內放入表達式，接著就會表達式裡的值是否符合case條件，然後再執行此條件相關的陳述式。

> switch case的判斷方式則不同，它是將表達式的值與case裡的值做比較，其條件判斷是分佈在「表達式」與「case」裡,通常表達式為單一的值或是運算式,只要有符合的case就會直接執行該區塊的結果,每一組case後面都要放break來告知程式中斷,若沒有加break則會於符合的case開始一直往下執行所有的結果,不管是否符合case,而switch case的default就像是else一樣,當其他的case皆不符合,將執行default的結果。
```
// if else語法
if (條件式一){
  // 若條件式一成立，則執行此區塊
}
else if (條件式二){
  // 若條件式二成立，則執行此區塊
}
else{
  // 若上述條件都不成立，則執行此區塊
}

// switch case語法
switch (表達式){
  case value1:
    //當 expression 的值符合 value1，則執行此陳述句
    break;
  case value2:
    //當 expression 的值符合 value2，則執行此陳述句
    break;
  ...
  case valueN:
    //當 expression 的值符合 valueN，則執行此陳述句
    break;
  default:
    //當 expression 的值都不符合上述條件式，則執行此陳述句
    break;
}
```
### 可讀性
* **if else：** 非常直覺，可套入人類的思考邏輯，如：「如果今天下雨，就要帶傘，沒有就不需要」，想到有什麼就寫什麼，之後若要再修改條件也是非常容易，因此很常被使用。
* **switch case：** 無法想到什麼就寫什麼，需要先仔細想想該如何應用。另外，在寫程式碼時還需注意加上break，程式才不會一直執行下去，假設判斷的東西變多，很有可能會有所遺漏。

這裡來看看若是沒加上break的話會有什麼結果：
> 如果忘記加break，那麼程式會從所對應的case開始執行，然後持續執行之後的case，不論正確不正確。
```
let num = 2;
switch(num){
  case 1:
    console.log(`1`);
  case 2:
    console.log(`2`);
  case 3:
    console.log(`3`);
  case 4:
    console.log(`4`);
  case 5:
    console.log(`5`);
}
// 輸出：2
// 輸出：3
// 輸出：4
// 輸出：5
```

### 嚴謹度
* **if else：** 不嚴謹，有時候會強制轉換裡面的參數。
* **switch case：** 嚴謹，在比較時使用「嚴格相等（===）」，需要在型別與值皆相同的情況下，才會成立。
> 一開始宣告變數為字串2，在if else裡會強制轉型為number去比較；而switch case就比較嚴格，要型別與值都相等的情況才成立。
```
let a = "2";
// if寫法
if (a == 1){
  console.log(`a等於數字1`);
}
else if(a == 2){
  console.log(`a等於數字2`);
}
else{
  console.log(`a不是數字1、2`);
}
// 輸出：a等於數字2

// switch
switch(a){
  case 1:
    console.log(`a等於數字1`);
  case 2:
    console.log(`a等於數字2`);
  default:
    console.log(`a不是數字1、2`);
}
// 輸出：a不是數字1、2
```

### 效能
這裡來比較一下兩者的效能如何，這裡使用迴圈來重複計算無用的數據，最後輸出計算時間。

```
// 宣告變數y為0
var y = 0;
// 計算當下時間
var x1 = performance.now();
// 使用if else
for (var i = 0; i < 10000000; i++) {
    for (var z = 0; z <= 4; z++) {
        if (z == 0) {
            y++;
        }
        else if (z == 1) {
            y--;
        }
        else if (z == 2) {
            y += 2;
        }
        else if (z == 3) {
            y -= 2;
        }
        else if (z == 4) {
            y += 3;
        }
    }
}
// 計算當下時間
var x2 = performance.now();
// 使用switch case
for (var i = 0; i < 10000000; i++) {
    for (var z = 0; z <= 4; z++) {
        switch (z)
        {
            case 0:
            y++;
            break;

            case 1:
            y--;
            break;

            case 2:
            y += 2;
            break;

            case 3:
            y -= 2;
            break;

            case 4:
            y += 3;
            break;
        }
    }
}
// 計算當下時間
var x3 = performance.now();

console.log(`執行if else所花費的時間：${x2-x1}`); // 輸出：102.70000000298023
console.log(`執行switch case所花費的時間：${x3-x2}`); // 輸出：90.09999999403954
```

### 使用時機
前面講了這麼多，到底要使用哪一個呢？

其實並沒有哪一個比較好，哪一個比較爛。每個語法被創造出來都有它擅長的地方，我們需要視情況來使用。如果需要「範圍取值」，那就是if else的強項；如果是「確定取值」，那就是用switch case來處理。

### 結語
最後稍微總結這兩者的差別。
|          | if else  | switch case |
| -------- | -------- | ----------- |
| 可讀性   | 較高     | 較低        |
| 嚴謹性   | 較不嚴謹 | 較嚴謹    |
| 效能    | 較低     | 較高        |
| 使用時機 | 範圍取值 | 確定取值   |

參考資料：
> https://jameshsu0407.github.io/blog/20211023_if-else_switch-case/
> https://hackmd.io/1Ssm6IY6RzSkipR4-ROnUg?view
> https://hackmd.io/@2aB7oKEoRxutmxFnScypxA/H1edwnKHY
> https://hsiangfeng.github.io/javascript/20200117/3217748743/
> 