表示されているページは、編集用 バージョンの MDN Web Docsです

MDN Web Docs のユーザーとして表示: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/label

ラベル付き文は、 break 文や continue 文と組み合わせて使用することができます。これは文に参照先となる識別子の接頭辞をつけます。

注: ループやブロックに名前を付けることはめったにありません。ふつうは、ジャンプによるループの代わりに関数呼び出しを使用することができます。

構文

ラベル :
  
ラベル
予約語ではない任意の JavaScript の識別子。
文。 break は任意のラベル付き文で使うことができ、 continue はループのラベル付き文で使うことができます。

解説

ループを識別するためにラベルを使い、そして、プログラムがループを中断すべきか、またはその実行を継続すべきかを指し示すために、break または continue 文を使うことができます。

JavaScript には goto 文がなく、ラベルと break または continue のみ使用できます。

厳格モードのコードでは、 "let" をラベル名として使用することができません。この場合、 SyntaxError が発生します (let は予約語です)。

ラベル付き continue を for ループで使用する

var i, j;

loop1:
for (i = 0; i < 3; i++) {      // 1 番目の for 文に "loop1" というラベルをつける
   loop2:
   for (j = 0; j < 3; j++) {   // 2 番目の for 文に "loop2" というラベルをつける
      if (i === 1 && j === 1) {
         continue loop1;
      }
      console.log('i = ' + i + ', j = ' + j);
   }
}

// 結果:
//   "i = 0, j = 0"
//   "i = 0, j = 1"
//   "i = 0, j = 2"
//   "i = 1, j = 0"
//   "i = 2, j = 0"
//   "i = 2, j = 1"
//   "i = 2, j = 2"
// "i = 1, j = 1" と "i = 1, j = 2" をスキップしていることに注目

ラベル付き continue 文を使用する

配列 items と tests について、このサンプルはすべてを tests に渡した items の数を数えます。

var itemsPassed = 0;
var i, j;

top:
for (i = 0; i < items.length; i++) {
  for (j = 0; j < tests.length; j++) {
    if (!tests[j].pass(items[i])) {
      continue top;
    }
  }

  itemsPassed++;
}

for ループでラベル付き break を使用する

var i, j;

loop1:
for (i = 0; i < 3; i++) {      // 1 番目の for 文に "loop1" というラベルをつける
   loop2:
   for (j = 0; j < 3; j++) {   // 2 番目の for 文に "loop2" というラベルをつける
      if (i === 1 && j === 1) {
         break loop1;
      }
      console.log('i = ' + i + ', j = ' + j);
   }
}

// 結果:
//   "i = 0, j = 0"
//   "i = 0, j = 1"
//   "i = 0, j = 2"
//   "i = 1, j = 0"
// continue の例との違いに注目

ラベル付き break 文を使用する

配列 items と tests について、このサンプルは items のすべてを tests に渡したかを判断します。

var allPass = true;
var i, j;

top:
for (i = 0; i < items.length; i++) {
  for (j = 0; j < tests.length; j++) {
    if (!tests[j].pass(items[i])) {
      allPass = false;
      break top;
    }
  }
}

break を使用したラベル付きブロックの使用

ラベルを単純なブロックの中でも使用することができますが、ループ以外のラベルでは break 文のみが意味を持ちます。

foo: {
  console.log('face');
  break foo;
  console.log('this will not be executed');
}
console.log('swap');

// this will log:

// "face"
// "swap" 

ラベル付き関数宣言

ECMAScript 2015 から、ラベル付き関数宣言が web compatibility annex of the specification において、厳格モード以外のコードで標準化されました。

L: function F() {}

ただし、厳格モードのコードでは SyntaxError が発生します。

'use strict';
L: function F() {}
// SyntaxError: functions cannot be labelled

ジェネレーター関数は、厳格モードであってもなくてもラベル付けすることはできません。

L: function* F() {}
// SyntaxError: generator functions cannot be labelled

仕様書

仕様書
ECMAScript (ECMA-262)
Labelled statement の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
labelChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 4Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.1.100

凡例

完全対応  
完全対応

関連情報

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

このページの貢献者: mfuji09, isdh, mdnwebdocs-bot, yyss, teoli, ethertank, Mgjbot, Nanto vi
最終更新者: mfuji09,