while
Baseline Широко доступен
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Инструкция while создает цикл, который выполняет указанную инструкцию до тех пор, пока условие истинно. Условие проверяется перед выполнением инструкции.
Попробуйте
let n = 0;
while (n < 3) {
n++;
}
console.log(n);
// Expected output: 3
Синтаксис
while (condition) statement
-
condition - Выражение, вычисляемое перед каждой итерацией цикла. Если это условие вычисляется как истинное, выполняется
statement. Когда условие вычисляется как ложное, выполнение продолжается с инструкции после циклаwhile. -
statement - Инструкция, которая выполняется до тех пор, пока условие истинно. Вы можете использовать блочную инструкцию для выполнения нескольких инструкций.
Описание
Как и другие циклы, вы можете использовать операторы управления потоком внутри statement:
-
breakостанавливает выполнениеstatementи переходит к первой инструкции после цикла. -
continueостанавливает выполнениеstatementи повторно вычисляетcondition.
Примеры
Использование while
Следующий цикл while итерирует, пока n меньше трех.
let n = 0;
let x = 0;
while (n < 3) {
n++;
x += n;
}
Каждую итерацию цикл увеличивает n и добавляет его к x. Следовательно, x и n принимают следующие значения:
- После первой итерации:
n= 1 иx= 1 - После второй итерации:
n= 2 иx= 3 - После третьей итерации:
n= 3 иx= 6
После завершения третьей итерации условие n < 3 больше не истинно, поэтому цикл завершается.
Использование присваивания в качестве условия
В некоторых случаях может иметь смысл использовать присваивание в качестве условия. Это связано с компромиссами в читаемости, поэтому существуют определенные стилистические рекомендации, которые сделают шаблон более очевидным для всех.
Рассмотрим следующий пример, который итерирует по комментариям документа, регистрируя их в консоли.
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
let currentNode;
while (currentNode = iterator.nextNode()) {
console.log(currentNode.textContent.trim());
}
Это не совсем хороший пример использования, из-за следующей строки:
while (currentNode = iterator.nextNode()) {
Эффект этой строки нормальный — в том, что каждый раз, когда находится узел комментария:
-
iterator.nextNode()возвращает этот узел комментария, который присваиваетсяcurrentNode. - Значение
currentNode = iterator.nextNode(), следовательно, истинное. - Таким образом, вызывается
console.log(), и цикл продолжается.
… а затем, когда в документе больше нет узлов комментариев:
-
iterator.nextNode()возвращаетnull. - Значение
currentNode = iterator.nextNode(), следовательно, также являетсяnull, что является ложным. - Таким образом, цикл завершается.
Проблема с этой строкой заключается в том, что условия обычно используют операторы сравнения, такие как ===, но = в этой строке не является оператором сравнения — это оператор присваивания. Таким образом, этот = выглядит как опечатка в === — хотя на самом деле это не опечатка.
Поэтому в таких случаях некоторые инструменты линтинга кода, такие как правило ESLint no-cond-assign — чтобы помочь вам обнаружить возможную опечатку и исправить ее — сообщат предупреждение, подобное следующему:
Ожидалось условное выражение, а вместо этого обнаружено присваивание.
Многие руководства по стилю рекомендуют более явно указывать намерение, чтобы условие было присваиванием. Вы можете сделать это минимально, добавив дополнительные скобки в качестве оператора группировки вокруг присваивания:
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
let currentNode;
while ((currentNode = iterator.nextNode())) {
console.log(currentNode.textContent.trim());
}
На самом деле, именно такой стиль навязывается конфигурацией ESLint по умолчанию no-cond-assign, а также Prettier, поэтому вы, вероятно, увидите этот шаблон часто.
Некоторые люди могут также рекомендовать добавить оператор сравнения, чтобы превратить условие в явное сравнение:
while ((currentNode = iterator.nextNode()) !== null) {
Существуют и другие способы написания этого шаблона, например:
while ((currentNode = iterator.nextNode()) && currentNode) {
Или, отказавшись от идеи использования цикла while:
const iterator = document.createNodeIterator(document, NodeFilter.SHOW_COMMENT);
for (
let currentNode = iterator.nextNode();
currentNode;
currentNode = iterator.nextNode()
) {
console.log(currentNode.textContent.trim());
}
Если читатель достаточно знаком с шаблоном присваивания в качестве условия, все эти вариации должны иметь одинаковую читаемость. В противном случае последняя форма, вероятно, наиболее читаема, хотя и наиболее многословна.
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
while |
1 |
12 |
1 |
3 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/while