switch
文は式を評価し、その式の値が case
のラベルと一致するなら、その case に関連付けられた文を実行します。
構文
switch (expression) { case value1: // 式の結果が value1 にマッチする場合に実行する文 [break;] case value2: // 式の結果が value2 にマッチする場合に実行する文 [break;] ... case valueN: // 式の結果が valueN にマッチする場合に実行する文 [break;] default: // 式の値にマッチするものが存在しない場合に実行する文 [break;] }
expression
- 結果が各 case 節と一致するか調べる式。
case valueN
expression
と一致するか調べるのに使う case 節。
説明
switch 文は始めに、式を評価します。プログラムは最初に式の値と一致する (厳密等価演算子 ===
を使用) ラベルを持つ case
節を探し、そしてその節に制御を移し、関連付けられた文を実行します。(もし複数の case が与えられた値に一致するなら、たとえ case がお互いに等しくなくても、一致した最初の case が選択されます。) もし一致する case
節が見つからなければ、プログラムは省略可能な default
節を探します。そしてもし見つかれば、その節に制御を移し、関連付けられた文を実行します。もし default
節が見つからなければ、プログラムは switch
の終わりに続く文から実行を継続します。規約により、default
節は最後の節ですが、そうである必要はありません。
各ケースのラベルに関連付けられた省略可能な break
文は、一度一致した文が実行されたら、プログラムが switch から抜け出し、switch に続く文から実行を継続することを保証します。もし break
が省略されたなら、プログラムは switch
文の中の次の文から実行を継続します。
例
例: switch
を使う
次の例では、もし expr
が "Bananas" に評価されるなら、プログラムは case "Bananas" で値に一致し、関連付けられた文を実行します。break
と遭遇したときは、プログラムは switch
から抜け出し、switch
に続く文を実行します。もし break
が省略されたなら、case "Cherries" に対する文も実行されます。
switch (expr) { case "Oranges": console.log("Oranges are $0.59 a pound."); break; case "Apples": console.log("Apples are $0.32 a pound."); break; case "Bananas": console.log("Bananas are $0.48 a pound."); break; case "Cherries": console.log("Cherries are $3.00 a pound."); break; case "Mangoes": case "Papayas": console.log("Mangoes and papayas are $2.79 a pound."); break; default: console.log("Sorry, we are out of " + expr + "."); } console.log("Is there anything else you'd like?");
break を置かないとどうなるか?
break を置かなければ、スクリプトは基準を満たす case から実行され、その後の case も基準を満たすかに関係なく実行されます。こちらの例をご覧ください:
var foo = 0; switch (foo) { case -1: console.log('negative 1'); break; case 0: // foo は 0 であり、基準を満たすためでこのブロックを実行する console.log(0); // 注記: ここに break を置くのを忘れている case 1: // 'case 0:' に break 文がないため、この case も実行される console.log(1); break; // この break に当たるため、'case 2:' には続かない case 2: console.log(2); break; default: console.log('default'); }
複数基準の case の使用法
この技法の出典はこちらです:
Switch statement multiple cases in JavaScript (Stack Overflow)
複数の case とひとつの操作
この方法は、case 文の配下に break がない場合に、次の case も基準を満たすかに関係なく実行されるという事実を活用します。"break を置かないとどうなるか?" の章をご覧ください。
これは連続した switch 文とひとつの操作の例であり、4 つの異なる値でまったく同じ操作を行います。
var Animal = 'Giraffe'; switch (Animal) { case 'Cow': case 'Giraffe': case 'Dog': case 'Pig': console.log('This animal will go on Noah\'s Ark.'); break; case 'Dinosaur': default: console.log('This animal will not.'); }
複数の case とひと続きの操作
これは連続した switch 文と複数の操作の例であり、与えられた整数に応じてさまざまな出力を受けます。case 文を置いた順に操作が続いて行くことを示しており、case 文は数値順に並べる必要はありません。JavaScript では、これらの case 文の中に文字列の定義を混入することができます。
var foo = 1; var output = 'Output: '; switch (foo) { case 10: output += 'So '; case 1: output += 'What '; output += 'Is '; case 2: output += 'Your '; case 3: output += 'Name'; case 4: output += '?'; console.log(output); break; case 5: output += '!'; console.log(output); break; default: console.log('Please pick a number from 0 to 6!'); }
このサンプルの出力は以下のとおりです:
値 | 記録するテキスト |
---|---|
foo が NaN である、あるいは 1, 2, 3, 4, 5, 10 のいずれでもない | Please pick a number from 0 to 6! |
10 | Output: So What Is Your Name? |
1 | Output: What Is Your Name? |
2 | Output: Your Name? |
3 | Output: Name? |
4 | Output: ? |
5 | Output: ! |
仕様
仕様書 | 策定状況 | コメント |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | 標準 | 最初期の定義。JavaScript 1.2 で実装。 |
ECMAScript 5.1 (ECMA-262) switch statement の定義 |
標準 | |
ECMAScript 2015 (6th Edition, ECMA-262) switch statement の定義 |
標準 | |
ECMAScript 2017 Draft (ECMA-262) switch statement の定義 |
ドラフト |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |