close
文章出處

很早以前就覺得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
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()