toiletpaper-icon-154

Vergessenes JavaScript Feature: Labels

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.

Ohne Labels
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('-');
}
For Loop mit Labels
outer: for (const row of rows) {
  for (const cell of row) {
    switch (cell) {
      case 'break':
        break outer;
      case 'continue':
        continue outer;
    }
  }
  console.log('-');
}
Das ganze geht praktischerweise auch mit Bedingungen:
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.
jambit-toiletpaper-154-visual

Weiterführende Aspekte

---

Autor: Santo Pfingsten / Senior Software Architect / Standort Leipzig

Cookie-Einstellungen

Diese Website verwendet Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und Zugriffe auf die Website zu analysieren. Zudem werden Informationen zu Ihrer Verwendung der Website an Partner für soziale Medien, Werbung und Analysen weitergegeben. Die Partner führen diese Informationen möglicherweise mit weiteren Daten zusammen, die Sie ihnen bereitgestellt haben oder die sie im Rahmen Ihrer Nutzung der Dienste gesammelt haben.

Weitere Informationen finden Sie in unserer Datenschutzerklärung. Dort können Sie nachträglich auch Ihre Cookie-Einstellungen ändern.

contact icon

Kontakt aufnehmen