### 🔍小範例大學問👊
# [<font color="#f00">JavaScript</font>] if 與 switch 的使用時機?
---
## 1. 基本程式碼樣貌與執行方式:
```javascript=
let n = 1;
switch(n){
case 1:
console.log('yes');
break;
default:
console.log('no');
break;
}
// console 輸出 yes
if(n == 1){
console.log('yes');
}else{
console.log('no');
}
// console 輸出 yes
```
```javascript=
let n = 5;
switch(n){
case 1:
console.log('1');
break;
case 2:
console.log('2');
break;
default:
console.log('no');
break;
}
// console 輸出 no
if(n == 1){
console.log('1');
}else if(n == 2){
console.log('2')
}else{
console.log('no');
}
// console 輸出 no
```
💬說明: switch 會直接執行 default 的程式碼 ;但 if 會從一開始處理到最後的 else 才會知道執行 else 的程式碼。
## 2. 嚴謹度比較:
```javascript=
let p = "2";//值改成字串的2
switch(p){
case 2:
console.log('yes');
break;
default:
console.log('no');
break;
}
// console 輸出 no
if(p == 2){
console.log('yes');
}else{
console.log('no');
}
// console 輸出 yes
```
判斷式是相同的,但可以發現 switch 和 if else 在執行上有著不一樣的結果,這是因為 switch 在判斷上採取嚴謹模式,亦即 ===(即型別也要相同),而在 if else 的判斷上並沒有採取這麼嚴謹的模式。
## 3. 處理速度比較:
```javascript=
let n = 1;
switch(n){
case 1:
console.log('1');
break;
case 2:
console.log('2');
break;
case 3:
console.log('3');
break;
case 4:
console.log('4');
break;
case 5:
console.log('5');
break;
case 6:
console.log('6');
break;
case 7:
console.log('7');
break;
case 8:
console.log('8');
break;
case 9:
console.log('9');
break;
case 10:
console.log('10');
break;
default:
console.log('no');
break;
}
// console 輸出 1
```
```javascript=
let n = 1;
if(n == 1){
console.log('1');
}else if(n == 2){
console.log('2');
}else if(n == 3){
console.log('3');
}else if(n == 4){
console.log('4');
}else if(n == 5){
console.log('5');
}else if(n == 6){
console.log('6');
}else if(n == 7){
console.log('7');
}else if(n == 8){
console.log('8');
}else if(n == 9){
console.log('9');
}else if(n == 10){
console.log('10');
}else{
console.log('no');
}
// console 輸出 1
```
==> if 勝
```javascript=
let n = 10;
switch(n){
case 1:
console.log('1');
break;
case 2:
console.log('2');
break;
case 3:
console.log('3');
break;
case 4:
console.log('4');
break;
case 5:
console.log('5');
break;
case 6:
console.log('6');
break;
case 7:
console.log('7');
break;
case 8:
console.log('8');
break;
case 9:
console.log('9');
break;
case 10:
console.log('10');
break;
default:
console.log('no');
break;
}
// console 輸出 10
```
```javascript=
let n = 10;
if(n == 1){
console.log('1');
}else if(n == 2){
console.log('2');
}else if(n == 3){
console.log('3');
}else if(n == 4){
console.log('4');
}else if(n == 5){
console.log('5');
}else if(n == 6){
console.log('6');
}else if(n == 7){
console.log('7');
}else if(n == 8){
console.log('8');
}else if(n == 9){
console.log('9');
}else if(n == 10){
console.log('10');
}else{
console.log('no');
}
// console 輸出 10
```
==> switch 勝
在處理速度上並沒有固定的誰優誰劣,而是要看判斷式的內容而定。
如果確定會有非常大的部分落在某一個選項時,採用 if 的方式最佳,只需把最常發生的選項放在 if 的第一個,保證速度最快。
但如果每一個選項都有一定的機率會被判斷到時,反而採用 switch 會是比較好的選擇。
💬說明:近代的電腦處理速度已今非昔比, if 和 switch 依處理速度來做抉擇,已不是重要的選擇點了。
## 4. 程式碼異常狀況:
```javascript=
let n = 1;
switch(n){
case 1:
console.log('1');
// break;漏打
case 2:
console.log('2');
break;
case 3:
console.log('3');
break;
case 4:
console.log('4');
break;
case 5:
console.log('5');
break;
default:
console.log('no');
break;
}
// console 輸出 1 和 2
```
💬說明: switch 如果漏打 break 會執行到出現 break 為止。 case 越多, break 也會越多,對於除錯來說,會較困難。
```javascript=
let n = 100;
switch(n){
default:
console.log('no');
break;
case 1:
console.log('1');
break;
case 2:
console.log('2');
break;
case 3:
console.log('3');
break;
case 4:
console.log('4');
break;
case 5:
console.log('5');
break;
}
// console 輸出 no
```
```javascript=
let n = 100;
if(n == 1){
console.log('1');
}else if(n == 2){
console.log('2');
}else if(n == 3){
console.log('3');
}else{
console.log(no);
}else if(n == 4){
console.log('4');
}else if(n == 5){
console.log('5');
}
//Uncaught SyntaxError: Unexpected token 'else'.
```
💬說明: switch 的 default 放最上面時,程式碼一樣可以執行;但是 if 的 else 沒放最後就會出現程式錯誤的提示。
## 5. switch 使用的限制:
```javascript=
let n = 100;
if(n > 50){
console.log('大於50');
}else if(n == 50){
console.log('剛好50');
}else if(n < 50){
console.log('小於50');
}else{
console.log('打錯了');
}
// console 輸出 大於50
```
💬說明: switch 只能對一個變數進行比對,針對範圍型的處理,就會變得窒礙難行。
## <font color="#f00">📌總整理(使用時機與優劣)</font>
| | switch| if|
| ---------------------| -- | -- |
| 單一變數(值)比對 | v | |
| 多變數(值)或範圍比對 | | ✔️ |
| 較好除錯 | |✔️ |
| 執行效率 | ✔️ | |
| 嚴謹度 | ✔️ | |
| 處理速度 | ❓| ❓ |
| 工程師的最💖 | | ⭐ |
---
#### 參考文章
* [為什麼很多程式設計師不用switch,而是大量的if……else if?](https://www.juduo.cc/club/709536.html)
* [[[Java] if-else pk switch,誰快?](https://www.jackforfun.com/java-if-else-pk-switch)
* [JavaScript 基礎知識-switch & if else 的判別差異](https://ithelp.ithome.com.tw/articles/10211561)