---
# System prepended metadata

title: if 與 switch 的使用時機？
tags: [六角學院, Javascript]

---

# if 與 switch 的使用時機？

###### tags: `六角學院` `Javascript`


---


### if 與 switch case 本質上的語法差異
if 與 switch case 在程式界不只是Javascript，幾乎在許多語言中，都是非常常用且很常拿來比較的兩個 ==條件判斷== 工具，要比較首先必須觀察雙方的語法差異，以下我們考慮根據不同的a值執行不同的結果

```javascript=
//if語法

if (a == 1)
 [dosomething]
else if (a == 2)
 [dosomething]
else if (a == 3)
 [dosomething] 
else 
 [dosomething] 
```


```javascript=
//switch case語法

switch (a) {

case 1: 
 [dosomething]
 break;
case 2: 
 [dosomething]
 break;
case 3: 
 [dosomething]
 break;
default: 
 [dosomething]
 break;
}

```
簡易的範例似乎看不出來兩者的差別，如果再**更複雜一點**呢？
我們來判斷　==在a和b都是正數的情況下，a+b是否大於c？==


```javascript=
//if語法

var a = 1,
  b = 2,
  c = 2;

if (a > 0 && b > 0) {
  if (a + b > c) {
    console.log("a+b大於c");
  } else {
    console.log("a+b不大於c");
  }
} else {
  console.log("a和b不都是正數");
}
```


```javascript=
//switch case語法

switch (a > 0 && b > 0) {
  case true:
    switch (a + b > c) {
      case true:
        console.log("a+b大於c");
        break;
      case false:
        console.log("a+b不大於c");
        break;
    }
    break;
  case false:
    console.log("a和b不都是正數");
    break;
}
```

從上面這個例子可以看出來，switch case和if else雖然都可以實現同樣的功能，但是對於 ==邏輯判斷表示式== 來說if else更加靈活，可以判斷的條件會比switch case有彈性，如果遇到需要複雜條件來實現的例子，switch case會顯得笨重。

換句話說，switch case比較適合使用來判斷 ==單一變數== 的條件，對於需要 ==比較== 或是更加複雜的多重條件，使用switch case是相對麻煩的。

:::info
寫到這裡很多人可能會想，那我們到底要switch case做什麼用呢？因為 if-else 也可以達到簡單的變量判斷呀？
:::

答案就是 ==效率與程式可讀性==


---


### if 與 switch case 效能上的差異

我們先來看兩張圖比較 if 與 switch case 的執行流程 : 

#### switch case 流程圖
![](https://i.imgur.com/O38FUcd.png)


#### if 流程圖
![](https://i.imgur.com/yUXCngr.png)


從上面兩個圖可以明顯的看出來，對於if-else來說需要 ==掃過每一個條件== 直到找到符合條件的case，對於不同case其實執行時間是不一樣的，進入第一個case需要判斷1次，符合第二個case需要判斷2次，以此類推，又如果是最後一個才進入的話，等於以上的條件都會被執行。

而switch case本質是在編譯的時候生成一張table來指示case的位址，通常編譯器都會對table進行優化2，所以它所有case都可以 ==通過少量判斷== 就跳轉到對應符合條件的case，對於每一個case的執行時間基本是相同的。

> 綜合來說，在一般分支夠多的情況下，switch case的效率是高於if-else的。



---


### if 與 switch case 的程式易讀性

由上面的例子可以看出，當判斷條件為邏輯表示式且條件較少的時候，使用if else看起來比switch case簡潔而且維護起來也更容易。==但是當條件數超過三個且都是常數的時候==，我們來看下面這個簡單的例子：

```javascript=
//switch case
switch (color) {
  case "red":
    console.log("red");
    break;
  case "yellow":
    console.log("yellow");
  case "blue":
    console.log("blue");
  default:
    console.log("unknown color");
}

//if
if (color === "red") {
  console.log("red");
} else if (color === "yellow") {
  console.log("yellow");
} else if (color = "blue") {
  console.log("blue");
} else {
  console.log("unknown color");
}
```

用switch case看起來就非常清楚明瞭且效能更好，即使再加幾個條件看起來程式碼也不會顯得冗長，維護性和可讀性都比if else更好。



---

### 結論

- 在分支非常多且只是簡單便量的情況下應該優先考慮switch case，不僅考慮到效率，也應該綜合程式碼可讀性，可維護性等。
- 選擇使用哪個表示式之前應該評估每個條件出現的可能性，如果if else的前面兩三個條件就可以覆蓋到絕大部分情況，其實if else的效率並不會比switch case低。
- 這兩種表示式的不同在效率上對整體程式碼的執行時間影響很小，應該把程式碼的可讀性，可維護性等考慮因素放在效率之前。

---

### 參考資料

[switch case和if else比較](https://www.itread01.com/content/1544470087.html)
[switch...case && if...else效率比較和優化](https://iter01.com/195048.html)
[MDN switch case](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/switch)
