Javascript "switch" 語句

2023-02-17 10:37 更新

?switch ?語句可以替代多個 ?if ?判斷。

?switch ?語句為多分支選擇的情況提供了一個更具描述性的方式。

語法

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

就像這樣:

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

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

  default:
    ...
    [break]
}
  • 比較 ?x? 值與第一個 ?case?(也就是 ?value1?)是否嚴格相等,然后比較第二個 ?case?(?value2?)以此類推。
  • 如果相等,?switch ?語句就執(zhí)行相應(yīng) ?case ?下的代碼塊,直到遇到最靠近的 ?break ?語句(或者直到 ?switch ?語句末尾)。
  • 如果沒有符合的 case,則執(zhí)行 ?default ?代碼塊(如果 ?default ?存在)。

舉個例子

switch 的例子(高亮的部分是執(zhí)行的 case 部分):

let a = 2 + 2;

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

這里的 switch 從第一個 case 分支開始將 a 的值與 case 后的值進行比較,第一個 case 后的值為 3 匹配失敗。

然后比較 4。匹配,所以從 case 4 開始執(zhí)行直到遇到最近的 break

如果沒有 break,程序?qū)⒉唤?jīng)過任何檢查就會繼續(xù)執(zhí)行下一個 case。

無 break 的例子:

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" );
}

在上面的例子中我們會看到連續(xù)執(zhí)行的三個 alert

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

任何表達式都可以成為 ?switch/case? 的參數(shù)

switch 和 case 都允許任意表達式。

比如:

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,這個值跟 case 中 b + 1 相比較,然后執(zhí)行對應(yīng)的代碼。

“case” 分組

共享同一段代碼的幾個 case 分支可以被分為一組:

比如,如果我們想讓 case 3 和 case 5 執(zhí)行同樣的代碼:

let a = 3;

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.');
}

現(xiàn)在 3 和 5 都顯示相同的信息。

switch/case 有通過 case 進行“分組”的能力,其實是 switch 語句沒有 break 時的副作用。因為沒有 breakcase 3 會從 (*) 行執(zhí)行到 case 5。

類型很關(guān)鍵

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

比如,我們來看下面的代碼:

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 ?對話框輸入 ?0?、?1?,第一個 ?alert ?彈出。
  2. 輸入 ?2?,第二個 ?alert ?彈出。
  3. 但是輸入 ?3?,因為 ?prompt ?的結(jié)果是字符串類型的 ?"3"?,不嚴格相等 ?===? 于數(shù)字類型的 ?3?,所以 ?case 3? 不會執(zhí)行!因此 ?case 3? 部分是一段無效代碼。所以會執(zhí)行 ?default ?分支。

任務(wù)


將 "switch" 結(jié)構(gòu)重寫為 "if" 結(jié)構(gòu)

重要程度: 5

將下面 switch 結(jié)構(gòu)的代碼寫成 if..else 結(jié)構(gòu):

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!' );
}

解決方案

為了精確實現(xiàn) switch 的功能,if 必須使用嚴格相等 '==='。

對于給定的字符串,一個簡單的 '==' 也可以。

if(browser == 'Edge') {
  alert("You've got the Edge!");
} else if (browser == 'Chrome'
 || browser == 'Firefox'
 || browser == 'Safari'
 || browser == 'Opera') {
  alert( 'Okay we support these browsers too' );
} else {
  alert( 'We hope that this page looks ok!' );
}

請注意:將 browser == 'Chrome' || browser == 'Firefox' … 結(jié)構(gòu)分成多行可讀性更高。

但 switch 結(jié)構(gòu)更清晰明了。


將 "if" 結(jié)構(gòu)重寫為 "switch" 結(jié)構(gòu)

重要程度: 4

用 switch 重寫以下代碼:

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

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

if (a == 2 || a == 3) {
  alert( '2,3' );
}

解決方案

前兩個檢查為前兩個 case,第三個檢查分為兩種情況:

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

switch (a) {
  case 0:
    alert( 0 );
    break;

  case 1:
    alert( 1 );
    break;

  case 2:
  case 3:
    alert( '2,3' );
    break;
}

請注意:最后的 break 不是必須的。但是為了讓代碼可擴展我們要把它加上。

有可能之后我們想要再添加一個 case,例如 case 4。如果我們忘記在它之前添加一個 break,那么在 case 3 執(zhí)行結(jié)束后可能會出現(xiàn)錯誤。所以這是一種自我保險。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號