Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

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
基本サポート (有) (有) (有) (有) (有) (有)

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: yyss, vikohone, teoli, ethertank, Mgjbot, Nanto vi
 最終更新者: yyss,