整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript中的switch語句

          avaScript語言中的條件語句,除了if 語句,還有switch 語句。switch 常用于根據(jù)不同的條件執(zhí)行不同的操作。雖然它和 if 語句都是用來判斷條件的語句,但是它們之間還是有不同。

          switch的語法

          語法如下所示:

          switch(expression) {
              case 變量x:
              // 語句1代碼塊
              case 變量y:
              // 語句2代碼塊
              case 變量z:
              // 語句3代碼塊
              break;
              default:
              // 代碼塊
          }
          

          語法解釋:表達(dá)式值計(jì)算一次,然后我們依次將表達(dá)式的值與每一種 case 情況的值進(jìn)行比較,如果匹配,就會執(zhí)行與 case 對應(yīng)的相關(guān)代碼塊。

          執(zhí)行原理:變量 expression 的值與 case 的值進(jìn)行比較,比如變量 expression 等于 case 變量 x,我們就執(zhí)行語句1的代碼塊,如果變量 expression 等于 case 變量 y 就執(zhí)行語句2的代碼塊,依次類推,如果都不符合就執(zhí)行 default 語句代碼塊。break 語言用于結(jié)束當(dāng)前執(zhí)行的語句,default 表示默認(rèn)的,在沒有符合選項(xiàng)的時候默認(rèn)選擇。

          示例:

          使用 switch 語句來看判斷今天是星期幾,并輸出對應(yīng)時間。例如在一個 HTML 文件中,寫入下列代碼:

          <!DOCTYPE html>
          <html>
          <head>
          <meta charset="utf-8">
          <title>JS_俠課島(9xkd.com)</title>
          </head>
          <body>
            <div>
              <p id="date"></p>
            </div>
            <script>
              var day;
              var d = new Date().getDay();  
              switch(d) {
                  case 0:
                    day = "星期天";
                    break;
                  case 1:
                    day = "星期一";
                    break;
                  case 2:
                    day = "星期二";
                    break;
                  case 3:
                    day = "星期三";
                    break;
                  case 4:
                    day = "星期四";
                    break;
                  case 5:
                    day = "星期五";
                    break;
                  case 6:
                    day = "星期六";
                    break;
                  case 7:
                    day = "星期天";
                    break;
              }
              document.getElementById("date").innerHTML = day;
              </script>
            </body>    
          </html>
          

          在瀏覽器中打開這個HTML文件,頁面會顯示:

          星期二

          我們來分析一下 <script> 標(biāo)簽中的 JavaScript 代碼,變量 d 是我們獲取到的當(dāng)天的星期天數(shù)(我寫這個文章的時候是星期二),getDay() 方法會返回與星期相對應(yīng)的數(shù)字,例如星期一返回1、星期二返回2,以此類推。

          然后我們將這個變量 d 作為switch 語句的表達(dá)式值,將它與 case 后面的值匹配,如果表達(dá)式等于某個 case 后面的值,則執(zhí)行響應(yīng)的代碼。例如上述代碼中,變量 d 的值為2,那么就會匹配到 case 2,所對應(yīng)的代碼就是day = "星期二";,所以輸出結(jié)果為星期二。后面還有一個break 語句,這個語句的作用就是跳出 switch 語句,避免同時執(zhí)行多個case。

          default 關(guān)鍵詞

          default 關(guān)鍵詞規(guī)定 case 匹配不存在時所做的事情。

          示例:

          例如我們看下面這段代碼:

          var level = "P";
          switch(level){
              case "A":
                  console.log("第一類");
                  break;
              case "B":
                  console.log("第二類");
                  break;
              case "C":
                  console.log("第三類");
                  break;
              case "D":
                  console.log("第四類");
                  break;
              default:
                  console.log("其他");
          }
          

          輸出:

          其他
          

          上述代碼中,如果 level 的值不滿足任何 case 的值,則會匹配到 default。代碼中 level 的值為 P,而 case 語句中的值只有A、B、C、D,此時就會匹配到 default 語句,執(zhí)行 default 語句下面的代碼。

          break 關(guān)鍵詞用于跳出 switch 代碼塊。使用 break 能夠節(jié)省大量執(zhí)行時間,因?yàn)樗鼤雎?switch 代碼塊中的其他代碼的執(zhí)行。

          switch 與 if 的對比

          關(guān)于條件分支 switch 和 if 兩者之間的區(qū)別和關(guān)聯(lián),我們可以通過下面這個表格進(jìn)行簡單直觀的認(rèn)識:

          • if 語句表達(dá)式的結(jié)果是 boolean 布爾類型,常用于區(qū)間判斷。
          • switch 表達(dá)式類型不能是 boolean 布爾類型,可能是 byte、int、char、string、枚舉,常用于等值判斷。

          注意一般能用 switch 語句實(shí)現(xiàn)的就一定能使用 if 語句來實(shí)現(xiàn),但是反過來卻是不一定的,如果區(qū)間范圍就采用 if,如果等值判斷就使用 switch。

          效率問題:

          • switch case 會生成一個跳轉(zhuǎn)表來指示實(shí)際的 case 分支地址。
          • switch case 只能處理 case 為常量的情況。
          • if else 需要遍歷條件分支知道命中條件。
          • if else 能應(yīng)用于更多的場所,比較靈活,但是必須遍歷所有可能的值。

          動手小練習(xí)

          1. 寫一個小程序,讓用戶輸入月份,提示相應(yīng)的季節(jié),如果都不在指定的月份中則輸出"請正確輸入月份"。
          2. 熟記 switch 和 if 的基本內(nèi)容以及兩者間的關(guān)聯(lián)與區(qū)別。

          多程序都具有switch語句,用于作為菜單功能。當(dāng)傳入的參數(shù)的值等于菜單選項(xiàng)將會執(zhí)行菜單選項(xiàng)中的內(nèi)容,但是JavaScript語言具有特殊性有三等(===)和兩等(==)兩種情況,對于JavaScript來說switch使用的是三等呢,還是兩等呢?我們以下面這段程序來進(jìn)行闡述。

          <!DOCTYPE html>
          <html>
              <head>
                  <title>簡單的switch的使用</title>
                  <meta charset="utf-8">
              </head>
              <body>
                  <script>
                      var a="1";
                      var b=2;
                      function foo(){
                          
                          switch(a){
                              case 1:{
                                  console.log("number 1");
                                  break;
                              }
                              case 2:{
                                  console.log("number 2");
                                  break;
                              }
                              case "1":{
                                  console.log("string 1");
                                  break;
                              }
                              case (function(){return "2"})():{
                                  console.log("value is true");
                                  break;
                              }
                              default:{
                                  console.log("not match");
                                  break;
                              }
                          }
                      }
                      foo();
                  </script>
              </body>
          </html>

          這段程序定義了一個變量其參數(shù)自為字符串型的'1',菜單選項(xiàng)中有數(shù)字型的選項(xiàng)1和2還有字符串型的參數(shù)“1”還有一個變量的表達(dá)式以及一個默認(rèn)的參數(shù)選項(xiàng)。

          直接運(yùn)行這段程序輸出的結(jié)果是string 1。

          當(dāng)修改a的值為字符串“2”時輸出的結(jié)果為value is true。

          由上述可以switch的菜單選項(xiàng)使用的是三等需要參數(shù)值和參數(shù)類型都相等才會執(zhí)行菜單選項(xiàng)中的值,同時如果菜單選項(xiàng)為一個表達(dá)式如果表達(dá)式返回的結(jié)果和傳入的選項(xiàng)的值相等將會執(zhí)行表達(dá)式后面選項(xiàng)的程序。所以綜上所述switch語句如果菜單語句是表達(dá)式如果表達(dá)式的值為真將會執(zhí)行菜單語句中的內(nèi)容,如果是參數(shù)值如果傳入的值的值與菜單中的值是三等則會執(zhí)行菜單語句中的內(nèi)容。

          witch語句幾乎是任何一個編程任務(wù)里不可缺少的一部分。在本文中,你將學(xué)到如何更好的使用switch,并希望你能知道如何情況下我就需要用到它幫我們更好的解決問題。

          何時使用switch其實(shí)有個明顯的標(biāo)志—當(dāng)你連續(xù)書寫了多個if/else語句的時候。下面舉例讓我們看看使用if/else的情況,對比一下我們使用switch語句來完成同樣功能。

          使用if/else語法非常的冗長,包含了很多不必要的重復(fù)代碼。switch語法則不這樣:

          可以看出代碼量會有所減少,并且非常清晰易懂。這是因?yàn)閟witch語法強(qiáng)調(diào)的點(diǎn)在于對象要去比較可能出現(xiàn)的值,而if/else重點(diǎn)在于條件結(jié)果的值。

          使用break

          當(dāng)JavaScript遍歷整個case分支時,你最好使用break語句來阻斷它。避免匹配上了非預(yù)料的、不合適的條件,執(zhí)行了錯誤的結(jié)果。同樣也能幫助引擎過濾掉不必執(zhí)行的額外代碼。

          在這個例子中,break語句實(shí)際上不會起任何作用。例如:如果走case 2分支的情況,那么絕對不會走case 5分支。所以這里break有點(diǎn)點(diǎn)多余。是否嚴(yán)格使用break語句的用法有點(diǎn)像是否在表達(dá)式末尾使用分號(;)結(jié)束一樣,各個開發(fā)者都有自己的選擇。有些開發(fā)人員在所有case中使用break,有些則策略性的使用break。全面的使用會帶來一點(diǎn)點(diǎn)性能損失。然而,因?yàn)榫退闳绻麤]有機(jī)會會走其他case分支,至少這樣寫不會讓解析引擎走遍所有switch語句。

          策略性使用break

          有些情況你想讓你的cases能夠’fall through’。這時候使用break更像是一種策略,而不是一種安全措施。

          在這個例子中,cases是‘falling through’,break用于顯式的提前退出switch。它表示你將幾個case的條件合并在一起,得到用一個結(jié)果。

          如果使用if/else的版本,會使用許多||邏輯判斷,看起來不是特別易懂:

          處理default分支

          Switch的另外一個特性是能夠處理未知的case或一般需要處理的case。回到 我們第一個例子中來,我們使用default來實(shí)現(xiàn)錯誤處理:

          你可能注意到了default被加在了最頂部。不用擔(dān)心!它可以和你期望的那樣work。因?yàn)镴avaScript將遍歷所有case分支后才會處理default。

          你同樣能使用default來處理一般情況的case:

          它確保了就算switch語句中沒有匹配到任何你定義的case,也能得到一個有用的值。

          結(jié)論

          在你需要寫多個if/else語句代碼塊時,switch語句是一個非常優(yōu)雅的替代方式。即使你可能不像使用for循環(huán)那樣頻繁的使用switch,但在你需要的時候沒有替代品。如今,像lodash和redux這樣的現(xiàn)代庫仍然使用switch。所以更多的在你的JavaScript代碼中使用switch吧!如果你覺得這篇文章對你有幫助,請關(guān)注我們前端小號頭條號!~謝謝


          主站蜘蛛池模板: 久久久av波多野一区二区| 伊人久久精品一区二区三区| 国产高清在线精品一区二区| 国产成人精品一区在线| 国产一区二区三区高清在线观看 | 中文字幕在线观看一区| 国产亚洲一区二区三区在线不卡| 亚洲精品一区二区三区四区乱码| 一区二区三区四区电影视频在线观看| 人妻无码一区二区三区AV| 亚洲国产av一区二区三区 | 日本一区二三区好的精华液| 香蕉视频一区二区| 麻豆va一区二区三区久久浪| 午夜福利av无码一区二区| 日韩aⅴ人妻无码一区二区| 日韩欧国产精品一区综合无码| 国产日韩精品一区二区在线观看| 日本免费一区二区久久人人澡| 夜夜高潮夜夜爽夜夜爱爱一区| 色噜噜狠狠一区二区三区果冻| 一区二区三区91| 亚洲一区视频在线播放| 国产精品无码一区二区三区免费| 女人和拘做受全程看视频日本综合a一区二区视频| 国产AV国片精品一区二区| 日本一区二区三区不卡在线视频 | 亚洲国产精品无码久久一区二区| 日本视频一区二区三区| 无码丰满熟妇一区二区| 人妻天天爽夜夜爽一区二区| 亚洲AV成人一区二区三区AV| 精品福利一区二区三区精品国产第一国产综合精品 | 国产另类TS人妖一区二区| 一区二区三区杨幂在线观看| 日韩在线一区二区三区免费视频| 日韩精品免费一区二区三区| 国产乱码精品一区二区三区四川| 国内精品一区二区三区在线观看 | 一色一伦一区二区三区| 日本精品一区二区三本中文|