大頭照

你好,我是米米

菜雞前端工程師

[教學]if else與switch case的比較

別在if了,試試switch吧~

米米

JS、if else與switch case的比較

前言

在寫程式的時候如果要判斷東西,你第一個想到的是什麼語法??我想絕大多數的人都會選擇用if else吧!因為我也是一樣~ 不過其實還有另一位弟兄可以寫判斷式,它就是最近剛發表的Switch啦!!!!!!(最近才剛收了一台二手switch,每次下班後都想拿起來玩,不想寫文章……. 咳咳!扯遠了。這個switch case也能寫判斷式,所以這次就來比較看看兩者間的差異~

目錄:

語法差異

  • if else:當條件成立的時候會執行其陳述式裡的程式,而不成立時則執行另外一個陳述式。
  • switch case:括號內放入表達式,接著就會表達式裡的值是否符合case條件,然後再執行此條件相關的陳述式。

從上面的程式碼可知,if else是將整個要判斷的內容放在條件式,其條件式是使用布林值作為判斷基礎,並且可以搭配邏輯運算子使用,例如:if ( a < 10 && a >= 5),這裡就代表如果變數a的值介於5~10之間,程式就會執行該區塊的內容;switch case的判斷方式則不同,它是將表達式的值與case裡的值做比較,其條件判斷是分佈在「表達式」與「case」裡

這裡特別講一下switch case也能夠做到區間判斷,就像if else語法一樣,但又不太一樣。

讓我們看看傳統的if else是如何判斷區間:

接著使用switch case的寫法,如果將if else的寫法搬過來使用,答案會是…

什麼?為什麼會不及格?有哪邊出錯了嗎?其實這樣的判斷邏輯是對的,只是不了解switch case在比對的方法。

剛剛前面有提到switch case的判斷方式為:「將表達式的值與case去做比對」,以上面的程式碼為例,第一個比較的就「表達式的是score」與「casescore >= 90」是否相等,這裡是用布林值來做判斷truefalse,所以程式其實是以77 !== true來做判斷。

由此可見,這樣的判斷寫法是錯誤的,因此程式就會繼續執行,最後因為所以條件都不符才會跑進default裡。

到這裡希望大家可以先停下腳步,想想看若要改程式碼的話,應該要如何調整呢?(提示:想想判斷條件及布林值的比較)

3…

2…

1…答案揭曉:

很簡單的,表達式帶入的值不需要是變數本身,只需寫true即可,亦即需要判斷的事情就交給case,表達式只需等同於它即可。

可讀性

  • if else:非常直覺,可套入人類的思考邏輯,如:「如果今天下雨,就要帶傘,沒有就不需要」,想到有什麼就寫什麼,之後若要再修改條件也是非常容易,因此很常被使用。
  • switch case:無法想到什麼就寫什麼,需要先仔細想想該如何應用。另外,在寫程式碼時還需注意加上break,程式才不會一直執行下去,假設判斷的東西變多,很有可能會有所遺漏。

這裡來看看若是沒加上break的話會有什麼結果:

如果忘記加break,那麼程式會將所對應的case開始執行,然後持續執行之後的case,不論正確不正確。

BTW,因為不想打太多case,剛剛嘗試用for迴圈來帶入case,並且「沒有加break」,想不到結果出乎意料:

我預計會輸出「2,3,4,5」,結果卻輸出了「2」。

於是我就上網爬文、找人求救,後來得到答案了。若用for迴圈包住switch case的話,程式碼會這樣執行:

它會分開執行,不會將case包在同一個switch裡,所以沒加break就沒有差別了。

嚴謹度

  • if else:不嚴謹,有時候會強制轉換裡面的參數。
  • switch case:嚴謹,在比較時使用「嚴格相等(===)」,需要在型別皆相同的情況下,才會成立。

一開始宣告變數為字串2,在if else裡會強制轉型為number去比較;而switch case就比較嚴格,要型別與值都相等的情況才成立。

效能:

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

我的電腦輸出的時間可能會跟大家不一樣,有興趣的同學可以複製下來貼到瀏覽器上跑跑看,也可以改迴圈的執行次數(貼心小提醒:不要設太大,怕你點腦死去~

現代的電腦都算強大的,通常switch case的執行時間會少於if else。基本上除非是專案需要大量的判斷,否則在效能上是看不出太大的差異。

BTW,有時候if else的速度會比switch case還要快,因為它把會成立的條件放在前面,依序執行下去;而switch case則是以隨機訪問,因此有時候速度可能會比較慢。

switch case編譯後的執行流程大致如下:

  • 將每一個case編譯後程式的首地址保存到一個陣列中。
  • 根據傳入的值進行判斷,若存在就跳到索引的地址繼續進行;若不存在則直接跳到default
  • 其中的break直接跳到結尾處。
switch case流程

switch case利用陣列的隨機訪問,大大的增加判斷的效率,但是為了隨機訪問,會產生出一個陣列來保存地址,以空間換取時間來增加效率。

使用時機

前面講了這麼多,到底要使用哪一個呢?

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

結語

最後稍微總結這兩者的差別。

if else switch case
可讀性 ✔︎
嚴謹性 ✘,會強制轉型 ✔︎,使用嚴格相等比較
效能 ✔︎
使用時機 範圍取值 確定取值

參考資料:

if else 與 switch的使用時機

[JavaScript] if 與 switch 的使用時機?

How to use switch statement inside for loop?

JavaScript 的 if 跟 switch 效能

JavaScript switch Statement - Dot Net Perls

感謝抖內

BUY ME A COFFEE
comments powered by Disqus
comments powered by Disqus

advertisement

recent post

categories

advertisement

about

你好,我是米米,是個剛畢業就已經成為社畜的前端工程師==