mitmario.dev

while und do while

JavaScript Im Browser 3 Min Lesezeit 4 BeispieleLektion 2 von 6

Die for-Schleife der vorigen Lektion hat eine Voraussetzung, die man leicht übersieht: Man muss vorher wissen, wie oft sie laufen soll. Für alles andere gibt es while.

while

while prüft vorher
// Wie oft muss man 100 halbieren, bis man unter 1 landet?
// Das weiß man vorher nicht, also passt hier kein for.
let wert = 100;
let schritte = 0;

while (wert >= 1) {
  wert /= 2;
  schritte++;
  console.log("Schritt", schritte, "ergibt", wert);
}

console.log("Gebraucht:", schritte, "Halbierungen");

while bekommt nur eine Bedingung, keine drei Angaben. Es prüft sie vor jedem Durchlauf und läuft, solange sie wahr ist.

Der Zähler steht damit nicht mehr in den Klammern, sondern außerhalb der Schleife, und die Veränderung steht im Rumpf. Das ist der ganze Unterschied zur for-Schleife: Sie hat dieselben drei Teile, nur an drei verschiedenen Orten.

Genau darin liegt auch die Gefahr, dazu gleich mehr.

Das Beispiel zeigt den typischen Fall: Wie oft man 100 halbieren muss, um unter 1 zu kommen, weiß man vorher nicht. Man weiß nur, wann man fertig ist.

do while

do while läuft mindestens einmal
// Die Bedingung ist von Anfang an falsch.
let a = 10;
while (a < 5) {
  console.log("Das siehst du nie.");
  a++;
}
console.log("while hat gar nicht erst angefangen.");

console.log("---");

// Dieselbe Bedingung, und trotzdem läuft der Block einmal.
let b = 10;
do {
  console.log("Das siehst du genau einmal, obwohl b schon 10 ist.");
  b++;
} while (b < 5);
console.log("do while hat einmal gelaufen.");

do while dreht die Reihenfolge um: erst der Block, dann die Prüfung. Der Rumpf läuft deshalb mindestens einmal, auch wenn die Bedingung von Anfang an falsch ist.

Beachte die Schreibweise: Das while steht hinten, hinter der schließenden geschweiften Klammer, und dahinter gehört ein Semikolon. Das ist eine der wenigen Stellen, an denen hinter einer geschweiften Klammer ein Semikolon steht.

Gebraucht wird do while selten. Der klassische Fall ist eine Eingabe, die man erst abfragen muss, bevor man sie prüfen kann. In diesem Kurs kommt es nicht mehr vor, du solltest es nur lesen können.

Die vergessene Erhöhung

Die vergessene Erhöhung
let i = 0;
let notbremse = 0;

// Die Erhöhung von i fehlt. Ohne die Notbremse in der Bedingung
// liefe das hier für immer.
while (i < 3 && notbremse < 5) {
  console.log("Durchlauf, i steht auf", i);
  notbremse++;
}

console.log("Die Notbremse hat gegriffen, i steht immer noch auf", i);

Das ist die Fehlerquelle bei while, und sie hat einen einfachen Grund.

Bei einer for-Schleife steht der Schritt in derselben Klammer wie die Bedingung. Du siehst beim Schreiben sofort, ob er da ist. Bei while steht er irgendwo im Rumpf, vielleicht zehn Zeilen weiter unten, vielleicht in einem if, das nicht immer zutrifft.

Vergisst du ihn, ändert sich der geprüfte Wert nie, und die Bedingung bleibt für immer wahr. Was der Browser dann tut, steht in der vorigen Lektion.

Zwei Gewohnheiten helfen:

Schreib die Veränderung zuerst hin. Bevor du den eigentlichen Inhalt der Schleife tippst, schreib die Zeile, die den geprüften Wert verändert. Dann kannst du sie nicht mehr vergessen.

Bau eine Notbremse ein, solange du übst. Ein zweiter Zähler mit einer festen Obergrenze, mit && an die Bedingung gehängt. Das ist kein Anfängerkrückstock: In echtem Code steht so etwas überall dort, wo die Abbruchbedingung von Daten abhängt, die man nicht kontrolliert.

Die Notbremse hat noch einen zweiten Nutzen, und der ist der Grund, warum sie beim Üben so viel wert ist: Sie macht die Schleife nachschaubar. Eine Schleife, die endet, kannst du im Reiter Debug aufzeichnen und Schritt für Schritt durchblättern, bis du die Zeile findest, an der sich nichts mehr tut. Eine, die nicht endet, lässt die Seite hängen, und dann gibt es nichts mehr zu blättern.

Wann du was nimmst

Auf einen Zustand warten
// Wie viele Monate dauert es, bis 1000 Euro auf 1500 gewachsen sind,
// bei einem Prozent im Monat? Die Anzahl kennt man vorher nicht.
let guthabenInCent = 100000;
let monate = 0;

while (guthabenInCent < 150000) {
  guthabenInCent = Math.round(guthabenInCent * 1.01);
  monate++;
}

console.log("Monate:", monate);
console.log("Endstand in Cent:", guthabenInCent);

Die Entscheidung ist einfacher, als sie klingt.

for, wenn du die Anzahl kennst. Zehnmal, oder einmal je Eintrag einer Liste. Das ist der weitaus häufigere Fall, und ab Abschnitt 6 gibt es dafür sogar noch bequemere Formen.

while, wenn du auf einen Zustand wartest. Bis das Guthaben reicht, bis der Rest null ist, bis nichts mehr übrig ist. Die Anzahl der Durchläufe fällt dabei als Ergebnis an, statt vorher festzustehen.

Umbauen lässt sich jede in die andere. Eine for-Schleife ist eine while-Schleife mit ordentlich zusammengeräumten Teilen, mehr nicht. Nimm die, bei der man beim Lesen weniger nachdenken muss.

Zum Mitnehmen

for nimmst du, wenn du die Anzahl kennst. while, wenn du auf einen Zustand wartest.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe im Editor, direkt im Browser geprüft

    Öffnet sich mit dem Basis Konto.