1. 程式人生 > >switch case和if else比較

switch case和if else比較

switch case和if else常常被拿來比較,那是因為他們兩個都可以實現同樣的功能。這時候我們就會想什麼時候用哪個更好呢?

可以從下面幾個方面來做一下比較:
1.靈活性
首先看下面一個簡單的例子:

//在a和b都是正數的情況下判斷a+b是否大於c
var a = 1,
  b = 2,
  c = 2;

//方式1
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不都是正數"); } //方式2 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需要用更多的分支來實現和if else一樣的效果,在邏輯判斷表示式更復雜的時候表現的越明顯。而對於switch case來說常量的匹配會更加有優勢,特別注意switch case的關聯操作在一些情況下也非常有用,例子可以參考switch MDN文件

除此之外還有2點需要注意:
① 在許多語言中,switch的引數只能支援某些資料型別。而if幾乎可以支援所有的資料型別。
② if語句沒有else不會影響後續程式碼的執行,但是switch語句必須注意break的用法,具體可以參考

這篇文章

2.效率
借用2個圖1來說明下兩個語句的執行過程:
if else
圖1: if else執行流程圖

switch case
圖2: switch case執行流程圖

從上面兩個圖可以明顯的看出來,對於if else來說要遍歷每一個條件直到找到符合條件的case,對於不同case其實執行時間是不一樣的。進入第一個case需要判斷1次,符合第二個case需要判斷2次,以此類推……

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

沒有經過特定條件的巨大量的測試,沒法給出具體有幾個分支的時候選擇哪一種方式速度更快,但是以下幾點值得我們注意:
① 在分支比較多的情況下優先考慮switch case,不僅考慮到效率,也應該綜合程式碼可讀性,可維護性等。
② 選擇使用哪個表示式之前應該評估每個條件出現的可能性,如果if else的前面兩三個條件就可以覆蓋到絕大部分情況,其實if else的效率並不會比switch case低。
③ 這兩種表示式的不同在效率上對整體程式碼的執行時間影響很小,應該把程式碼的可讀性,可維護性等考慮因素放在效率之前。

3.可讀性和可維護性
參考闡述靈活性中的舉例,當判斷條件為邏輯表示式且條件較少的時候,使用if else看起來比switch case簡潔而且維護起來也更容易。
但是當條件數超過三個且都是常量的時候,看下面這個簡單的例子:

//方式1
switch (color) {
  case "red":
    console.log("red");
    break;
  case "yellow":
    console.log("yellow");
  case "blue":
    console.log("blue");
  default:
    console.log("unknown color");
}

//方式2
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不能只看一種因素,需要綜合考慮到各個方面。

關聯操作


  1. https://www.codewithc.com/difference-between-switch-case-and-else-if-ladder/ ↩︎

  2. http://www.voidcn.com/article/p-yxtpvpua-cs.html ↩︎