Problem
Wir kennen sicherlich alle diese Situation: Man hat verschachtelte Schleifen (oder Bedingungen) und muss aus der Tiefe komplett herausbrechen. Übliche Ansätze sind z. B.:
- Nach der inneren Schleife die Äußere durch eine weitere Bedingung zu verlassen.
- Den Code so zu refactoren, dass ein early-return verwendet wird, anstatt break zu verwenden.
Lösung
Dies kann man in JavaScript mit einem weitgehend vergessenen (sehr alten) Feature auch anders lösen. Labels ermöglichen es, Schleifen (und Bedingungen!) mit einem Namen zu versehen und sowohl mit den Statements break als auch continue diesen Namen dann anzusprechen.
for (const row of rows) {
let breakOuter = false;
let continueOuter = false;
for (const cell of row) {
if (cell === 'break') {
breakOuter = true;
break;
}
if (cell === 'continue') {
continueOuter = true;
break;
}
}
if (breakOuter) {
break;
}
if (continueOuter) {
continue;
}
console.log('-');
}
outer: for (const row of rows) {
for (const cell of row) {
switch (cell) {
case 'break':
break outer;
case 'continue':
continue outer;
}
}
console.log('-');
}
const [a, b, c] = [1, 3, 2];
found: if (a < b) {
if (c < b) {
break found;
}
console.log('never gets here');
}
console.log('done');
Beispiel
Wann sollte man Labels einsetzen?
- JS Labels sind nicht mit GoTo-Statements gleichzusetzen. Man springt nicht zu einem Label, sondern bindet ein break- bzw. continue-Statement an eine Bedingung oder Schleife. Ein wildes Springen wie in C/C++ ist also nicht möglich.
- Wichtig ist, wie so oft, das richtige Tool zur richtigen Zeit zu nutzen. In einigen Fällen kann man sicherlich auch den Code schöner schreiben als mit Labels. Falls nicht, sind Labels sicherlich eine Überlegung wert.
Weiterführende Aspekte
---
Autor: Santo Pfingsten / Senior Software Architect / Standort Leipzig
Toilet Paper #154 als Download: Vergessenes JavaScript Feature: Labels (PDF)
Lust, das nächste ToiletPaper zu schreiben? Jetzt bei jambit bewerben!