switch
語法可以取代多個 if
檢查。
它提供更具描述性的方式來比較一個值與多個變異。
語法
switch
有多個 case
區塊和一個可選的預設值。
它看起來像這樣
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
x
的值會檢查是否與第一個case
(也就是value1
)的值嚴格相等,然後再檢查第二個(value2
),以此類推。- 如果找到相等的值,
switch
會從對應的case
開始執行程式碼,直到最近的break
(或直到switch
的結尾)。 - 如果沒有匹配的
case
,則會執行default
程式碼(如果存在)。
範例
switch
的範例(執行中的程式碼以反白顯示)
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
開始將 a
與從第一個 case
變體(即 3
)開始的變體進行比較。比對失敗。
然後是 4
。這符合,因此執行從 case 4
開始,直到最近的 break
。
如果沒有 break
,則執行會繼續執行下一個 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" );
}
在上面的範例中,我們將看到三個 alert
的順序執行
alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
switch/case
參數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
進行比較,並執行對應的程式碼。
「case」的分組
可以將共用相同程式碼的幾個 case
變體分組。
例如,如果我們希望對 case 3
和 case 5
執行相同的程式碼
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) grouped two cases
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
現在 3
和 5
都顯示相同的訊息。
「分組」案例的能力是 switch/case
在沒有 break
的情況下運作的副作用。這裡 case 3
的執行從 (*)
行開始,並經過 case 5
,因為沒有 break
。
類型很重要
讓我們強調,相等性檢查總是嚴格的。值必須是相同類型才能匹配。
例如,讓我們考慮程式碼
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' );
}
- 對於
0
、1
,會執行第一個alert
。 - 對於
2
,會執行第二個alert
。 - 但對於
3
,prompt
的結果是一個字串"3"
,它與數字3
不完全相等===
。因此,我們在case 3
中得到了死程式碼!default
變體將執行。
留言
<code>
標籤;若要插入多行程式碼,請將它們包覆在<pre>
標籤中;若要插入超過 10 行的程式碼,請使用沙盒 (plnkr、jsbin、codepen…)