このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
ラベル
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
ラベル付き文は、任意の文に接頭辞として識別子を付けたものです。ラベル付き文の中にネストされたbreak 文やcontinue 文を使用すると、このラベルにジャンプすることができます。
In this article
試してみましょう
let str = "";loop1: for (let i = 0; i < 5; i++) { if (i === 1) { continue loop1; } str = str + i;}console.log(str);// Expected output: "0234"構文
ラベル: 文解説
ラベルを使用して文を識別すると、後でbreak またはcontinue 文を使用して参照することができます。JavaScript にはgoto 文がないことに注意してください。
ラベルを参照するbreak やcontinue は、ラベル によってラベル付けされた文 中になければなりません。ラベル は、文 の範囲内でしか利用できない変数だと考えてください。
もし、文 を実行中にbreak ラベル; 文に出会った場合、文 の実行が終了し、ラベル付けされた文の直後の文から実行を続けます。
continue ラベル; は、文 がループ文のうちの何れかである場合のみ使用できます。continue ラベル; 文が文 の実行中に現れた場合、文 の実行はループの次の反復処理に続きます。ラベルなしのcontinue; は最も内側のループのみを継続することができるのに対し、continue ラベル; はその文がほかのループの中にネストされていた場合でも、指定した任意のループの継続処理を行うことができます。
文に複数のラベルを付けることができます。この場合、ラベルはすべて機能的に同等になります。
例
>ラベル付き continue を for ループで使用
// 最初の文は "loop1" というラベルが付いていますloop1: for (let i = 0; i < 3; i++) { // 2 番目の文は "loop2" というラベルが付いています loop2: for (let j = 0; j < 3; j++) { 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" をスキップしていることに注目してください。
ラベル付き break を for ループで使用
let i, j;// 1 番目の for 文に "loop1" というラベルを付けるloop1: for (i = 0; i < 3; i++) { // 2 番目の for 文に "loop2" というラベルを付ける loop2: for (j = 0; j < 3; j++) { 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 loop1 に遭遇すると、外側ループの実行が終了するので、"i = 1, j = 0" 以降のログ出力はありません。continue loop1 に遭遇すると、外側ループの実行は次の反復処理で継続するので "i = 1, j = 1" だけスキップされます。
ラベル付き continue 文の使用
配列 items と tests について、この例はすべてを tests に渡した items の数を数えます。
// 1 から 100 までの数const items = Array.from({ length: 100 }, (_, i) => i + 1);const tests = [ { pass: (item) => item % 2 === 0 }, { pass: (item) => item % 3 === 0 }, { pass: (item) => item % 5 === 0 },];let itemsPassed = 0;itemIteration: for (const item of items) { for (const test of tests) { if (!test.pass(item)) { continue itemIteration; } } itemsPassed++;}continue itemIteration; 文が、現在のアイテムに対する残りのテストとitemsPassed カウンターを更新する文をスキップして、次のアイテムに続けていることに注意してください。ラベル付けを使用しない場合は、代わりに論理値フラグを使用する必要があります。
// 1 から 100 までの数const items = Array.from({ length: 100 }, (_, i) => i + 1);const tests = [ { pass: (item) => item % 2 === 0 }, { pass: (item) => item % 3 === 0 }, { pass: (item) => item % 5 === 0 },];let itemsPassed = 0;for (const item of items) { let passed = true; for (const test of tests) { if (!test.pass(item)) { passed = false; break; } } if (passed) { itemsPassed++; }}ラベル付き break 文を使用する
配列 items と tests について、このサンプルは items のすべてを tests に渡したかを判断します。
// 1 から 100 までの数const items = Array.from({ length: 100 }, (_, i) => i + 1);const tests = [ { pass: (item) => item % 2 === 0 }, { pass: (item) => item % 3 === 0 }, { pass: (item) => item % 5 === 0 },];let allPass = true;itemIteration: for (const item of items) { for (const test of tests) { if (!test.pass(item)) { allPass = false; break itemIteration; } }}この場合も、ラベルを使用しない場合は、代わりに論理値フラグを使用する必要があります。
// 1 から 100 までの数const items = Array.from({ length: 100 }, (_, i) => i + 1);const tests = [ { pass: (item) => item % 2 === 0 }, { pass: (item) => item % 3 === 0 }, { pass: (item) => item % 5 === 0 },];let allPass = true;for (const item of items) { let passed = true; for (const test of tests) { if (!test.pass(item)) { passed = false; break; } } if (!passed) { allPass = false; break; }}break を使用したラベル付きブロックの使用
ラベルは単純なブロックでも使用することができますが、ループ以外のラベルは break 文のみが意味を持ちます。
foo: { console.log("face"); break foo; console.log("this will not be executed");}console.log("swap");// Logs:// "face"// "swap"ラベル付き関数宣言
ラベルが適用できるのは文だけであり、宣言は含まれません。厳格モードでない場合、関数宣言をコードでラベル付けできる古い文法があります。
L: function F() {}ただし、厳格モードのコードではSyntaxError が発生します。
"use strict";L: function F() {}// SyntaxError: functions cannot be labelledジェネレーター関数や非同期関数は、厳格モードであってもなくてもラベル付けすることはできません。
L: function* F() {}// SyntaxError: generator functions cannot be labelledラベル付きの関数電源の構文は非推奨であり、厳格モードでないコードであっても使用すべきではありません。実際、関数の本体の中からこのラベルへジャンプすることはできません。
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-labelled-statements> |