while
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die while
-Anweisung erstellt eine Schleife, die eine angegebene Anweisung ausführt, solange die Bedingung als wahr bewertet wird. Die Bedingung wird vor der Ausführung der Anweisung ausgewertet.
Probieren Sie es aus
let n = 0;
while (n < 3) {
n++;
}
console.log(n);
// Expected output: 3
Syntax
while (condition)
statement
condition
-
Ein Ausdruck, der vor jedem Durchlauf der Schleife ausgewertet wird. Wenn diese Bedingung als wahr bewertet wird, wird
statement
ausgeführt. Wenn die Bedingung als falsch bewertet wird, wird die Ausführung mit der Anweisung nach derwhile
-Schleife fortgesetzt. statement
-
Eine Anweisung, die ausgeführt wird, solange die Bedingung als wahr bewertet wird. Sie können eine Block-Anweisung verwenden, um mehrere Anweisungen auszuführen.
Beschreibung
Wie andere Schleifenanweisungen können Sie Kontrollflussanweisungen innerhalb der statement
verwenden:
Beispiele
Verwendung von while
Die folgende while
-Schleife iteriert, solange n
kleiner als drei ist.
let n = 0;
let x = 0;
while (n < 3) {
n++;
x += n;
}
Bei jeder Iteration erhöht die Schleife n
und addiert es zu x
.
Daher nehmen x
und n
die folgenden Werte an:
- Nach dem ersten Durchlauf:
n
= 1 undx
= 1 - Nach dem zweiten Durchlauf:
n
= 2 undx
= 3 - Nach dem dritten Durchlauf:
n
= 3 undx
= 6
Nach Abschluss des dritten Durchlaufs ist die Bedingung n
< 3 nicht mehr wahr,
sodass die Schleife beendet wird.
Verwendung einer Zuweisung als Bedingung
In einigen Fällen kann es sinnvoll sein, eine Zuweisung als Bedingung zu verwenden. Dies bringt Lesbarkeitseinbußen mit sich, daher gibt es stilistische Empfehlungen, die das Muster für alle offensichtlicher machen.
Betrachten Sie das folgende Beispiel, das über die Kommentare eines Dokuments iteriert und sie in der Konsole protokolliert.
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
let currentNode;
while (currentNode = iterator.nextNode()) {
console.log(currentNode.textContent.trim());
}
Das ist nicht vollständig ein gutes Beispiel für Best Practices, aufgrund der folgenden spezifischen Zeile:
while (currentNode = iterator.nextNode()) {
Die Wirkung dieser Zeile ist in Ordnung — insofern als bei jedem gefundenen Kommentarknoten:
- Gibt
iterator.nextNode()
diesen Kommentarknoten zurück, dercurrentNode
zugewiesen wird. - Der Wert von
currentNode = iterator.nextNode()
ist daher wahr. - So wird der
console.log()
-Aufruf ausgeführt und die Schleife fortgesetzt.
…und wenn es keine weiteren Kommentarknoten im Dokument gibt:
- Gibt
iterator.nextNode()
null
zurück. - Der Wert von
currentNode = iterator.nextNode()
ist daher auchnull
, was falsch ist. - So endet die Schleife.
Das Problem mit dieser Zeile ist: Bedingungen verwenden typischerweise Vergleichsoperatoren wie ===
, aber das =
in dieser Zeile ist kein Vergleichsoperator — statt dessen ist es ein Zuweisungsoperator. Daher sieht das =
aus wie ein Tippfehler für ===
— auch wenn es in Wirklichkeit kein Tippfehler ist.
Daher werden in solchen Fällen einige Code-Linting-Tools wie die no-cond-assign
-Regel von ESLint — um Ihnen bei der Erkennung eines möglichen Tippfehlers zu helfen, damit Sie ihn korrigieren können — eine Warnung wie die folgende ausgeben:
Eine bedingte Ausdruckserwartung und stattdessen eine Zuweisung gesehen.
Viele Stilrichtlinien empfehlen, die Absicht der Bedingung als Zuweisung expliziter anzugeben. Sie können dies minimal tun, indem Sie zusätzliche Klammern als Gruppierungsoperator um die Zuweisung setzen:
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
let currentNode;
while ((currentNode = iterator.nextNode())) {
console.log(currentNode.textContent.trim());
}
Tatsächlich ist dies der Stil, den die Standardkonfiguration von no-cond-assign
von ESLint sowie Prettier erzwingt, daher werden Sie dieses Muster wahrscheinlich häufig in der freien Wildbahn sehen.
Einige Leute empfehlen möglicherweise zusätzlich, einen Vergleichsoperator hinzuzufügen, um die Bedingung in einen expliziten Vergleich zu verwandeln:
while ((currentNode = iterator.nextNode()) !== null) {
Es gibt andere Möglichkeiten, dieses Muster zu schreiben, wie zum Beispiel:
while ((currentNode = iterator.nextNode()) && currentNode) {
Oder ganz auf die Idee verzichten, eine while
-Schleife zu verwenden:
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
for (
let currentNode = iterator.nextNode();
currentNode;
currentNode = iterator.nextNode()
) {
console.log(currentNode.textContent.trim());
}
Wenn der Leser mit dem Muster einer Zuweisung als Bedingung ausreichend vertraut ist, sollten alle diese Varianten gleich lesbar sein. Andernfalls ist die letzte Form wahrscheinlich am leichtesten lesbar, wenn auch am umfangreichsten.
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-while-statement |
Browser-Kompatibilität
BCD tables only load in the browser