W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
?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
?語句末尾)。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 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
時的副作用。因為沒有 break
,case 3
會從 (*)
行執(zhí)行到 case 5
。
強調(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' )
}
prompt
?對話框輸入 ?0
?、?1
?,第一個 ?alert
?彈出。2
?,第二個 ?alert
?彈出。3
?,因為 ?prompt
?的結(jié)果是字符串類型的 ?"3"
?,不嚴格相等 ?===
? 于數(shù)字類型的 ?3
?,所以 ?case 3
? 不會執(zhí)行!因此 ?case 3
? 部分是一段無效代碼。所以會執(zhí)行 ?default
?分支。重要程度: 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)更清晰明了。
重要程度: 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)錯誤。所以這是一種自我保險。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: