2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

switchの別caseでconstが重複エラーになる理由:ブロックとbreakの違いをNode.jsで実測

2
Posted at

switchの各caseに同じ名前のconstを書いたら、別の分岐なのにSyntaxErrorになりました。caseラベル自体はスコープを分けません。各caseを波括弧で囲むと名前を分けられますが、breakによる処理の終了は別に必要です。

macOS 27.0.1・Node.js v24.22.1で、2026年10月30日に以下の4例を実行しました。ブラウザ・TypeScript・Windowsでは試していません。

別のcaseでも同じconstは宣言できない

switch ('b') {
  case 'a':
    const label = 'A';
    break;
  case 'b':
    const label = 'B';
    console.log(label);
}

実測結果は次のエラーです。

SyntaxError: Identifier 'label' has already been declared

'a'と'b'が同時に選ばれないことは、このエラーを避ける条件になりません。ここではswitch本体の同じ宣言領域にlabelを二度置いています。最初のbreakに届くかどうかよりも前に、コードの構文上の問題になります。

分岐を追加した直後なら、同じswitchの中でconstやletの名前が重なっていないか確認します。

重複を消しても、別caseの変数は初期化されていない

次は二つ目のconstを削り、最初のcaseで宣言したlabelを読みます。

switch ('b') {
  case 'a':
    const label = 'A';
    break;
  case 'b':
    console.log(label);
}

実測結果です。

ReferenceError: Cannot access 'label' before initialization

名前が同じ領域にあることと、値が入った状態で読めることは別です。今回は'b'から始まるため、labelの初期化を実行せずに読みました。エラー名が変わっただけで、直ったわけではありません。

各caseの処理を波括弧で囲む

分岐ごとに独立した作業用変数なら、明示的なブロックを作ります。

switch ('b') {
  case 'a': {
    const label = 'A';
    console.log(label);
    break;
  }
  case 'b': {
    const label = 'B';
    console.log(label);
    break;
  }
}

出力はBでした。それぞれのlabelは別のブロックの変数です。同じ名前でも今回の重複宣言エラーは起きません。

ここでの波括弧は変数の有効範囲を区切り、breakはswitchから処理を抜けます。役割が違うため、両方を確認します。

波括弧だけでは次のcaseへ進む

switch ('a') {
  case 'a': {
    console.log('A');
  }
  case 'b': {
    console.log('B');
    break;
  }
}

実測ではA、Bの順に出ました。

A
B

'b'に一致したからBが出たのではありません。'a'の処理を終えたあと、breakがないためそのまま次の処理へ進んでいます。こうした進み方をフォールスルーと呼びます。意図して共通処理へ進める設計もありますが、独立した分岐にするなら抜ける位置を確かめます。

実測はnew Function(code)で一例ずつ評価し、エラー名とメッセージを保存しました。一例目をソースファイルに直接置いても構文上の問題は残ります。

AIが生成したswitchを確認するときは、各caseに波括弧があるか、同じ名前をどこで宣言しているか、次へ進ませる意図があるかを別々に読みます。さらに、入力'a'と'b'の両方で出力を比べると、breakの抜けも見つけやすくなります。

仕様の参照先

ECMAScriptのswitch文には、CaseBlockのLexicallyDeclaredNamesに重複があれば構文エラーとする規則と、switch本体のために宣言を準備する処理があります。caseラベルがブロックを作る、という読み方はできません。


未経験者向けの体験版を公開しています

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?