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
の例です(実行されるコードはハイライトされています)
let
a =
2
+
2
;
switch
(
a)
{
case
3
:
alert
(
'Too small'
)
;
break
;
case
4
:
alert
(
'Exactly!'
)
;
break
;
case
5
:
alert
(
'Too large'
)
;
break
;
default
:
alert
(
"I don't know such values"
)
;
}
ここで、 switch
は、最初の case
である 3
から a
との比較を始めます。マッチはしません。
そして 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"
)
;
}
上の例では、3つの 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 =
2
+
2
;
switch
(
a)
{
case
4
:
alert
(
'Right!'
)
;
break
;
case
3
:
// (*) 2つのケースをグループ化
case
5
:
alert
(
'Wrong!'
)
;
alert
(
"Why don't you take a math class?"
)
;
break
;
default
:
alert
(
'The result is strange. Really.'
)
;
}
今、3
と 5
は同じメッセージを表示します。
ケースを “グループ化” する機能は、break
がない場合の switch/case
の動作の副作用です。ここで case 3
の実行は、break
がないので (*)
の行から始まり、case 5
を通り抜けます。
型の問題
等価チェックは常に厳密であることに注目しましょう。マッチするために値は同じ型である必要があります。
たとえば、このコードを考えてみましょう:
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
の場合は2つ目のalert
が実行されます。- しかし
3
の場合、prompt
の結果は文字列の"3"
なので、数字の3
との厳密な等価===
ではありません。そのため、case 3
はデッドコードです!default
ケースが実行されるでしょう。
コメント
<code>
タグを使ってください。複数行の場合は<pre>
を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。