Baseline Widely available
Die while
-Anweisung erzeugt eine Schleife, die eine bestimmte Anweisung ausführt, solange die Prüfbedingung als wahr bewertet wird. Die Bedingung wird vor der Ausführung der Anweisung ausgewertet.
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 der while
-Schleife fortgesetzt.
statement
Eine Anweisung, die ausgeführt wird, solange die Bedingung als wahr bewertet wird. Sie können eine Blockanweisung verwenden, um mehrere Anweisungen auszuführen.
Wie bei anderen Schleifenanweisungen können Sie Kontrollflussanweisungen innerhalb von statement
verwenden:
break
stoppt die Ausführung von statement
und fährt mit der ersten Anweisung nach der Schleife fort.continue
stoppt die Ausführung von statement
und wertet condition
neu aus.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 haben x
und n
die folgenden Werte:
n
= 1 und x
= 1n
= 2 und x
= 3n
= 3 und x
= 6Nach Abschluss des dritten Durchlaufs ist die Bedingung n
< 3 nicht mehr wahr, sodass die Schleife beendet wird.
In einigen Fällen kann es sinnvoll sein, eine Zuweisung als Bedingung zu verwenden. Dies geht mit Abstrichen in der Lesbarkeit einher, daher gibt es bestimmte stilistische Empfehlungen, um das Muster für alle offensichtlicher zu 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());
}
Dies ist kein durchgängiges Beispiel für bewährte Praktiken, insbesondere wegen der folgenden Zeile:
while (currentNode = iterator.nextNode()) {
Der Effekt dieser Zeile ist in Ordnung â in dem Sinne, dass jedes Mal, wenn ein Kommentarknoten gefunden wird:
iterator.nextNode()
gibt diesen Kommentarknoten zurück, der currentNode
zugewiesen wird.currentNode = iterator.nextNode()
ist daher wahrheitsgemäÃ.console.log()
-Aufruf ausgeführt, und die Schleife wird fortgesetzt....und dann, wenn keine Kommentarknoten mehr im Dokument vorhanden sind:
iterator.nextNode()
gibt null
zurück.currentNode = iterator.nextNode()
ist daher ebenfalls null
, was falsch ist.Das Problem bei dieser Zeile ist: typischerweise verwenden Bedingungen Vergleichsoperatoren wie ===
, aber das =
in dieser Zeile ist kein Vergleichsoperator â stattdessen ist es ein Zuweisungsoperator. Das =
sieht so aus, als wäre es ein Tippfehler für ===
â obwohl es kein Tippfehler ist.
Daher werden einige Code-Linting-Tools wie die ESLint-Regel no-cond-assign
â um Ihnen zu helfen, einen möglichen Tippfehler zu erkennen, damit Sie ihn beheben können â eine Warnung wie die folgende melden:
Anstelle eines bedingten Ausdrucks wurde eine Zuweisung erwartet.
Viele Stilrichtlinien empfehlen, die Absicht für die Bedingung als Zuweisung expliziter anzugeben. Sie können das 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 wird dieser Stil von der Standardkonfiguration von ESLint no-cond-assign
erzwungen, ebenso wie von Prettier, daher werden Sie dieses Muster wahrscheinlich oft in der freien Natur sehen.
Einige Leute empfehlen möglicherweise weiter, 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 gänzlich 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 die Leser ausreichend mit dem Muster der Zuweisung als Bedingung vertraut sind, sollten all diese Variationen eine gleichwertige Lesbarkeit aufweisen. Andernfalls ist die letzte Form wahrscheinlich am lesbarsten, wenn auch die ausführlichste.
Spezifikationen Browser-Kompatibilität Siehe auchRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4