很早以前就覺得switch很怪異,或者說一直沒太理解它,它怪異就怪異在非要給每個語句加上break;不然后面的語句就算不符合條件還是會執行,比如以下這段代碼
var num = 2;
switch(num){
case 1:
console.log(1);
case 2:
console.log(2);
case 3:
console.log(3);
case 4:
console.log(4);
}
執行效果如下
明明只有2才符合條件,但3跟4也被執行了,然后查教程說要加上break,后來代碼就成了下面這個樣子
var num = 2;
switch(num){
case 1:
console.log(1);
break;
case 2:
console.log(2);
break;
case 3:
console.log(3);
break;
case 4:
console.log(4);
break;
}
寫過若干個switch語句以后,心里不由產生一種情緒,switch太TM難用了,明明很簡單,非要讓人多寫一個break;還不如用if來判斷,不知道這是不是很多人都有的想法,反正在之前我是這么想的。
寫的代碼越多,就越覺得這太不對勁了,于是在想,如果每個語句都要寫break;那么解析器直接幫忙寫上就好了,可現實是,解析器并沒有這么干。在某一個瞬間,產生了一個想法,這個switch肯定還有我所不知道的東西,于是帶著這種心情在網上各種查,終于在某一個瞬間,找到了一絲曙光。
不知道你有沒有一種感覺哈,寫switch特別難用,當然這是有前提的,那就是你對switch不了解。說它難用不僅僅只是說每次要加break,在if中,我們判斷某個值如果等于2或者3的時候,我們可以下面這樣寫
var num = 3;
if(num===2||num===3){
console.log(true);
}
但如果要你在switch中實現這樣的一個功能,可能會令你無從下手。
以上都是瞎說——,因為switch是可以實現這些功能的,之所以我們會覺得不能實現是因為它的這種實現方式,太容易讓人誤解了,并且如果你不往那方面去想,很難發現它的用處。
下面是一個用switch實現的判斷num===2或===3的例子
var num = 2;
switch(num){
case 1:
console.log(1);
break;
case 2:
case 3:
console.log(2 + "或" + 3);
break;
case 4:
console.log(4);
break;
}
輸出如下
這個case是一個入口,當某個值相匹配時,就會去執行相應的代碼塊,并且如果沒有加break的話,后面的值不管是否匹配都會被執行直到遇見break將跳出switch語句,而以上的這段代碼就是利用的這一點,我們在這里并沒有給2的值加break;因此當值等于2的時候,還會接著往下執行,但在3中有一個break,因此執行完3就會被跳出。如果值為3則直接執行3代碼塊,接著跳出。
也就是說,之前我所認為的怪異,它是合理的,只是這些東西,沒有被我所發現。
如果想在switch中實現判斷,諸如1>2,則可以使用下面的這種方式來實現
var num = 2;
switch(true){
case num>1:
console.log("num>1");
break;
case num<1:
console.log("num<1");
break;
}
在switch中做判斷的時候,需要注意一點,它用的是全等===而非==,比如下面這段代碼
var num = "1";
switch(num){
case 1:
console.log(1);
break;
case 2:
console.log(2);
break;
}
它并沒有輸出1,因為在switch中默認使用的是全等,因此它不會進行隱式轉換。
如果你想實現隱式轉換,可以用下面這種方式來實現。
var num = "1";
switch(true){
case num==1:
console.log(1);
break;
case num==2:
console.log(2);
break;
}
輸出如下
這個true究竟是個什么...,這是你的第一反應?
之所以會有這種感覺,是因為我們對switch一直都存在著一些誤解,而且這種誤解很深很深,反正我從學編程以來就一直沒有理解這個switch,開始是它才過于基礎,導致很多人都不愿意去研究它。
為了解開這個switch之謎,我從重對它做一次講解,用代碼來講把。
switch(x){
case n:
.....
break;
}
其中的x代表某一個值,而case中的n如果和x一模一樣則會被執行,注意是一模一樣,舉個例子
(x = 5) 5 (n = x==5) true 因為5!==true所以不會被執行
具體代碼
var num = 5;
switch(num){
case num==5:
console.log(num);
break;
}
又如
var num = 5;
switch(num){
case true:
console.log(num);
break;
}
這里所說的一模一樣就是說的,num這個值和case上的值要一樣,不是單方面的case為true就為true。
而我們上面給switch傳true就是因為這個原因,因為true是個布爾值,所以我們才可以用判斷。
其實switch并沒有限制你要傳什么,它才不管你傳的是false還是數組,你case上的值只要和它相對應就ok,最后舉個例子
switch(undefined){
case [][0]:
console.log(undefined);
break;
}
輸出undefined。
雖然這篇文章是在講switch,但我覺得它同時也說明了一個道理.........自己去悟。
![]() |
不含病毒。www.avast.com |