精講 JavaScript 的 "switch" 語句

"switch" 語句

switch 語句能夠替代多個 if 判斷。javascript

switch 語句爲多分支選擇的狀況提供了一個更具描述性的方式。html

語法

switch 語句有至少一個 case 代碼塊和一個可選的 default 代碼塊。java

就像這樣:react

switch(x) {
  case 'value1':  // if (x === 'value1')
    ...
    [break]

  case 'value2':  // if (x === 'value2')
    ...
    [break]

  default:
    ...
    [break]
}
複製代碼
  • 比較 x 值與第一個 case(也就是 value1)是否嚴格相等,而後比較第二個 casevalue2)以此類推。
  • 若是相等,switch 語句就執行相應 case 下的代碼塊,直到遇到最靠近的 break 語句(或者直到 switch 語句末尾)。
  • 若是沒有符合的 case,則執行 default 代碼塊(若是 default 存在)。

舉個例子

switch 的例子(執行 case 4 部分):微信

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Too small' );
    break;
  case 4:
    alert( 'Exactly!' );
    break;
  case 5:
    alert( 'Too large' );
    break;
  default:
    alert( "I don't know such values" );
}
複製代碼

這裏的 switch 從第一個 case 分支開始將 a 的值與 case 後的值進行比較,第一個 case 後的值爲 3 匹配失敗。學習

而後比較 4。匹配,因此從 case 4 開始執行直到遇到最近的 breakthis

若是沒有 break,程序將不通過任何檢查就會繼續執行下一個 casespa

break 的例子:code

let a = 2 + 2;

switch (a) {
  case 3:
    alert( 'Too small' );
  case 4:
    alert( 'Exactly!' );
  case 5:
    alert( 'Too big' );
  default:
    alert( "I don't know such values" );
}
複製代碼

在上面的例子中咱們會看到連續執行的三個 alertcdn

alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
複製代碼

任何表達式均可以成爲 switch/case 的參數

switchcase 都容許任意表達式。

好比:

let a = "1";
let b = 0;

switch (+a) {
  case b + 1:
    alert("this runs, because +a is 1, exactly equals b+1");
    break;

  default:
    alert("this doesn't run");
}
複製代碼

這裏 +a 返回 1,這個值跟 caseb + 1 相比較,而後執行對應的代碼。


"case" 分組

共享同一段代碼的幾個 case 分支能夠被分爲一組:

好比,若是咱們想讓 case 3case 5 執行一樣的代碼:

let a = 2 + 2;

switch (a) {
  case 4:
    alert('Right!');
    break;

  case 3: // (*) 下面這兩個 case 被分在一組
  case 5:
    alert('Wrong!');
    alert("Why don't you take a math class?");
    break;

  default:
    alert('The result is strange. Really.');
}
複製代碼

如今 35 都顯示相同的信息。

switch/case 有經過 case 進行「分組」的能力,實際上是 switch 語句沒有 break 時的反作用。由於沒有 breakcase 3 會從 (*) 行執行到 case 5

類型很關鍵

強調一下,這裏的相等是嚴格相等。被比較的值必須是相同的類型才能進行匹配。

好比,咱們來看下面的代碼:

let arg = prompt("Enter a value?")
switch (arg) {
  case '0':
  case '1':
    alert( 'One or zero' );
    break;

  case '2':
    alert( 'Two' );
    break;

  case 3:
    alert( 'Never executes!' );
    break;
  default:
    alert( 'An unknown value' )
}
複製代碼
  1. prompt 對話框輸入 01,第一個 alert 彈出。
  2. 輸入 2,第二個 alert 彈出。
  3. 可是輸入 3,由於 prompt 的結果是字符串類型的 "3",不嚴格相等 === 於數字類型的 3,因此 case 3 不會執行!所以 case 3 部分是一段無效代碼。因此會執行 default 分支。

做業題

先本身作題目再看答案。

1. 將 "switch" 結構重寫爲 "if" 結構

重要程度:⭐️⭐️⭐️⭐️⭐️

將下面 "switch" 結構的代碼寫成 if..else 結構:

switch (browser) {
  case 'Edge':
    alert( "You've got the Edge!" );
    break;

  case 'Chrome':
  case 'Firefox':
  case 'Safari':
  case 'Opera':
    alert( 'Okay we support these browsers too' );
    break;

  default:
    alert( 'We hope that this page looks ok!' );
}
複製代碼

2. 將 "if" 結構重寫爲 "switch" 結構

重要程度:⭐️⭐️⭐️⭐

switch 重寫如下代碼:

let a = +prompt('a?', '');

if (a == 0) {
  alert( 0 );
}
if (a == 1) {
  alert( 1 );
}

if (a == 2 || a == 3) {
  alert( '2,3' );
}
複製代碼

答案:

在微信公衆號「技術漫談」後臺回覆 1-2-13 獲取本題答案。


現代 JavaScript 教程:開源的現代 JavaScript 從入門到進階的優質教程。React 官方文檔推薦,與 MDN 並列的 JavaScript 學習教程

在線免費閱讀:zh.javascript.info


掃描下方二維碼,關注微信公衆號「技術漫談」,訂閱更多精彩內容。

相關文章
相關標籤/搜索