先聲明下:本文中的switch僅限於JS,我並未查閱過其餘編程語言中switch的語法,但有朋友反映在OC中並不適用!express
屬於選擇結構,通常用於選擇要執行的多個代碼塊之一。編程
switch(expression) {
case value1: 執行代碼塊 1 break; case value2: 執行代碼塊 2 break; default: 表達式,與 case 1 和 case 2 不一樣時執行的代碼 }
工做原理:首先設置表達式 ,一般是一個變量。隨後表達式的值會與結構中的每一個 case 的值作比較。若是存在匹配,則與該 case 關聯的代碼塊會被執行。可使用break來阻止代碼向下一個case執行。編程語言
好的,根據以上的概念,switch能夠用於對錶達式的值進行簡單判斷,並執行不一樣狀況的代碼塊。學習
例如如下這種簡單的狀況:lua
1 //判斷今天是星期幾 2 3 var day=new Date().getDay(); 4 5 switch (day) 7 { 9 case 0: 11 x="Today it's Sunday"; 13 break; 15 case 1: 17 x="Today it's Monday"; 19 break; 21 case 2: 23 x="Today it's Tuesday"; 25 break; 27 case 3: 29 x="Today it's Wednesday"; 31 break; 33 case 4: 35 x="Today it's Thursday"; 37 break; 39 case 5: 41 x="Today it's Friday"; 43 break; 45 case 6: 47 x="Today it's Saturday"; 49 break; 51 }
看起來,並無if語句用着方便。由於,彷佛case只能設置常量,對範圍值的判斷並無if語句出色,可是請看下面的例子:spa
1 var num = parseInt(window.prompt('輸入成績')); 2 3 switch(true) 5 { 7 case num>=90 && num<=100: 8 9 alert('A'); 11 break; 12 13 case num>=80 && num<90: 14 15 alert('B'); 17 break; 18 19 default: 20 21 alert('C'); 23 break; 25 }
這個例子或許會讓人心生疑惑,爲何case後又能設置表達式呢,並且能夠正確判斷呢,這又必須從switch的工做原理開始提及。設計
先回顧一下switch的工做原理:code
首先設置表達式 ,一般是一個變量。隨後表達式的值會與結構中的每一個 case 的值作比較。若是存在匹配,則與該 case 關聯的代碼塊會被執行。可使用break來阻止代碼向下一個case執行。orm
這段話摘自w3school關於switch的介紹,原文並無什麼問題,可是咱們常常忽略的一個地方是 case 的值!在《JavaScript高級程序設計》一書中,對 case 的定義是value(值),這也很容易讓人誤解爲一個常量,固然,書中也介紹了 case 用表達式的狀況,但卻並未具體說明。blog
那麼,case到底能夠設置什麼呢?其實,查閱ECMA後,一切就很清楚了:
switch(Expression) CaseBlock
CaseClause:case Expression:
Return Normal Completion(empty).
CaseClause:case Expression:StatementList
Return the result of evaluating StatementList.
DefaultClause:default:
Return Normal Completion(empty).
DefaultClause:default:StatementList
Return the result of evaluating StatementList.
摘自——ECMA-262
先無論那些看不明白的英文,鎖定一個關鍵詞「Expression」——表達式,這下就清楚了, case 後面也能夠跟表達式!
1.switch(expression)先獲取expression的值做爲引用;
2.逐個case遍歷,計算表達式,表達式的值並不會影響switch判斷的基準,由於第一步已經獲取了引用;
3.若匹配case,就執行匹配case的代碼塊,若帶終止(如break)的話,就中止遍歷剩下的case。
4.若無匹配的case,case將所有遍歷一遍。
知道了工做原理,讓咱們再來看看上一個例子:
1 var num = 70; 2 3 switch(true) //引用true的值 5 { 7 case num>=90 && num<=100: //遍歷case1,計算表達式,表達式值爲false,兩個值不全等,繼續遍歷下一項 9 alert('A'); 11 break; 13 case num>=80 && num<90: //遍歷case2,計算表達式,表達式值爲false,兩個值不全等,繼續遍歷下一項 14 alert('B'); 15 break; 16 default: //以上case都不知足,執行此處代碼塊 18 alert('C'); 20 break; 22 } 23 24 //執行結果: alert('C');
講到這裏,相信你們對switch有更深刻了理解了,或許能夠試試下面的例子:
1 var num = 4; 2 3 switch (num) 5 { 7 case num = 1: 9 alert("1"); 11 break; 13 case num = 1: 15 alert("1"); 17 break; 19 case num = 3: 21 alert("3"); 23 break; 25 default: 27 alert("以上都不執行"); 29 alert(num); 31 break; 33 } 36 37 //執行結果:以上都不執行,3
咦,爲何會執行default中的代碼呢,在case1中,num被賦值爲1了,那麼num值與case2相等,應該執行case2中的代碼呀?其實,再往上翻翻,看看switch的工做原理的第一句:switch(expression)先獲取expression的值做爲引用。
這表示,switch是引用num的值,因此在接下來case中,對num賦值的操做並不會影響switch在第一步中的引用值。
一、引用num的值:4;
二、遍歷case1,計算表達式,表達式num被賦值爲1,兩個值不全等,繼續遍歷下一項;
此處,num值被從新賦值爲1後,switch判斷的基準值依然是4,由於判斷基準是引用自num的值,在第一步已經獲取了引用,因此在接下來的遍歷中,case中對num的賦值操做,並不會影響switch的判斷基準值;
三、遍歷case2,計算表達式,表達式num被賦值爲1,兩個值不全等,繼續遍歷下一項;
四、遍歷case2,計算表達式,表達式num被賦值爲3,兩個值不全等,繼續遍歷下一項;
五、以上結果都不匹配,執行此處代碼,此時,num的值爲3。
OK,寫到這裏,你們應該對switch有了必定的理解,若是還想更深刻的瞭解switch,建議去學習ECMA的相關資料!
這是JS菜鳥——本人對switch的理解,若是有什麼寫得不對的地方,歡迎你們指正!