[教學]if else與switch case的比較
別在if了,試試switch吧~
前言
在寫程式的時候如果要判斷東西,你第一個想到的是什麼語法??我想絕大多數的人都會選擇用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
」與「case
的score >= 90
」是否相等,這裡是用布林值來做判斷true
或false
,所以程式其實是以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
利用陣列的隨機訪問,大大的增加判斷的效率,但是為了隨機訪問,會產生出一個陣列來保存地址,以空間換取時間來增加效率。
使用時機
前面講了這麼多,到底要使用哪一個呢?
其實並沒有哪一個比較好,哪一個比較爛。每個語法被創造出來都有它擅長的地方,我們需要視情況來使用。如果需要「範圍取值」,那就是if else
的強項;如果是「確定取值」,那就是用switch case
來處理。
結語
最後稍微總結這兩者的差別。
if else |
switch case |
|
---|---|---|
可讀性 | ✔︎ | ✘ |
嚴謹性 | ✘,會強制轉型 | ✔︎,使用嚴格相等比較 |
效能 | ✘ | ✔︎ |
使用時機 | 範圍取值 | 確定取值 |
參考資料:
[JavaScript] if 與 switch 的使用時機?