switch 文は複数の if チェックに置換できます。
これは値を複数のパターンと比較するための、よりわかりやすい方法を提供します。
構文
switch は1つ以上の case ブロックを持ち、 オプションで default を持ちます。
このようになります:
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
xの値は、最初のcase(それはvalue1)の値と厳密な等価のチェックをされます、そして2つ目(value2)と続きます。- 等価なものが見つかった場合、
switchは該当するcaseから始まるコードを実行し始めます。最も近いbreakまで(もしくはswitchの終わりまで)。 - マッチするケースが無い場合は、
defaultコードが実行されます(存在する場合)
例
switch の例です(実行されるコードはハイライトされています)
ここで、 switch は、最初の case である 3 から a との比較を始めます。マッチはしません。
そして 4 です。マッチするので、case 4 から最も近い break までの実行を開始します。
break がない場合、チェックなしで次の case の実行を継続します。
break なしの例です:
上の例では、3つの alert が順に実行されるでしょう。
alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
switch / case の引数になります"case"のグルーピング
同じコードを共有する複数の case のパターンはグループ化できます。
たとえば、case 3 と case 5 で同じコードを実行したい場合:
今、3 と 5 は同じメッセージを表示します。
ケースを “グループ化” する機能は、break がない場合の switch/case の動作の副作用です。ここで case 3 の実行は、break がないので (*) の行から始まり、case 5 を通り抜けます。
型の問題
等価チェックは常に厳密であることに注目しましょう。マッチするために値は同じ型である必要があります。
たとえば、このコードを考えてみましょう:
0,1の場合、最初のalertが実行されます。2の場合は2つ目のalertが実行されます。- しかし
3の場合、promptの結果は文字列の"3"なので、数字の3との厳密な等価===ではありません。そのため、case 3はデッドコードです!defaultケースが実行されるでしょう。