W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
?switch
?語(yǔ)句可以替代多個(gè) ?if
?判斷。
?switch
?語(yǔ)句為多分支選擇的情況提供了一個(gè)更具描述性的方式。
switch
語(yǔ)句有至少一個(gè) case
代碼塊和一個(gè)可選的 default
代碼塊。
就像這樣:
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
x
? 值與第一個(gè) ?case
?(也就是 ?value1
?)是否嚴(yán)格相等,然后比較第二個(gè) ?case
?(?value2
?)以此類推。switch
?語(yǔ)句就執(zhí)行相應(yīng) ?case
?下的代碼塊,直到遇到最靠近的 ?break
?語(yǔ)句(或者直到 ?switch
?語(yǔ)句末尾)。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
從第一個(gè) case
分支開(kāi)始將 a
的值與 case
后的值進(jìn)行比較,第一個(gè) case
后的值為 3
匹配失敗。
然后比較 4
。匹配,所以從 case 4
開(kāi)始執(zhí)行直到遇到最近的 break
。
如果沒(méi)有 break
,程序?qū)⒉唤?jīng)過(guò)任何檢查就會(huì)繼續(xù)執(zhí)行下一個(gè) case
。
無(wú) 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" );
}
在上面的例子中我們會(huì)看到連續(xù)執(zhí)行的三個(gè) alert
:
alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
任何表達(dá)式都可以成為 ?
switch/case
? 的參數(shù)
switch
和case
都允許任意表達(dá)式。
比如:
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
,這個(gè)值跟case
中b + 1
相比較,然后執(zhí)行對(duì)應(yīng)的代碼。
共享同一段代碼的幾個(gè) case
分支可以被分為一組:
比如,如果我們想讓 case 3
和 case 5
執(zhí)行同樣的代碼:
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) 下面這兩個(gè) 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
有通過(guò) case 進(jìn)行“分組”的能力,其實(shí)是 switch 語(yǔ)句沒(méi)有 break
時(shí)的副作用。因?yàn)闆](méi)有 break
,case 3
會(huì)從 (*)
行執(zhí)行到 case 5
。
強(qiáng)調(diào)一下,這里的相等是嚴(yán)格相等。被比較的值必須是相同的類型才能進(jìn)行匹配。
比如,我們來(lái)看下面的代碼:
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
?對(duì)話框輸入 ?0
?、?1
?,第一個(gè) ?alert
?彈出。2
?,第二個(gè) ?alert
?彈出。3
?,因?yàn)?nbsp;?prompt
?的結(jié)果是字符串類型的 ?"3"
?,不嚴(yán)格相等 ?===
? 于數(shù)字類型的 ?3
?,所以 ?case 3
? 不會(huì)執(zhí)行!因此 ?case 3
? 部分是一段無(wú)效代碼。所以會(huì)執(zhí)行 ?default
?分支。重要程度: 5
將下面 switch
結(jié)構(gòu)的代碼寫(xiě)成 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!' );
}
為了精確實(shí)現(xiàn) switch
的功能,if
必須使用嚴(yán)格相等 '==='
。
對(duì)于給定的字符串,一個(gè)簡(jiǎn)單的 '=='
也可以。
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!' );
}
請(qǐng)注意:將 browser == 'Chrome' || browser == 'Firefox' …
結(jié)構(gòu)分成多行可讀性更高。
但 switch
結(jié)構(gòu)更清晰明了。
重要程度: 4
用 switch
重寫(xiě)以下代碼:
let a = +prompt('a?', '');
if (a == 0) {
alert( 0 );
}
if (a == 1) {
alert( 1 );
}
if (a == 2 || a == 3) {
alert( '2,3' );
}
前兩個(gè)檢查為前兩個(gè) case
,第三個(gè)檢查分為兩種情況:
let a = +prompt('a?', '');
switch (a) {
case 0:
alert( 0 );
break;
case 1:
alert( 1 );
break;
case 2:
case 3:
alert( '2,3' );
break;
}
請(qǐng)注意:最后的 break
不是必須的。但是為了讓代碼可擴(kuò)展我們要把它加上。
有可能之后我們想要再添加一個(gè) case
,例如 case 4
。如果我們忘記在它之前添加一個(gè) break,那么在 case 3 執(zhí)行結(jié)束后可能會(huì)出現(xiàn)錯(cuò)誤。所以這是一種自我保險(xiǎn)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: