switch 文は式を評価し、その式の値が case のラベルと一致するなら、その case に関連付けられた文を実行します。
構文
switch (expression) {
case value1:
// 式の結果が value1 にマッチする場合に実行する文
[break;]
case value2:
// 式の結果が value2 にマッチする場合に実行する文
[break;]
...
case valueN:
// 式の結果が valueN にマッチする場合に実行する文
[break;]
default:
// 式の値にマッチするものが存在しない場合に実行する文
[break;]
}
expression- 結果が各 case 節と一致するか調べる式。
case valueNexpressionと一致するか調べるのに使う 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 |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |