Как обратный цикл while знает, когда остановиться в JavaScript? - PullRequest
3 голосов
/ 25 февраля 2012

В JavaScript я недавно обнаружил, как наоборот, пока циклы быстрее.

Я видел их в таком виде:

var i = someArray.length;

while (i--) {
  console.log(someArray[i]);
}

Я проверил это, и он остановился, как только прошел весь массив.

Как он узнает, когда остановиться после завершения массива?

Ответы [ 4 ]

12 голосов
/ 25 февраля 2012

Цикл while вычисляет выражение в круглых скобках каждый раз в цикле.Когда это выражение достигнет значения Falsey, цикл остановится.

Примеры значений Falsey:

false 
0  
undefined  
NaN
null
""

В этом случае значение i будет уменьшаться каждый раз прицикл, и когда он достигает значения 0, цикл останавливается.Поскольку это пост-декрементный оператор, значение выражения проверяется перед декрементом.Это означает, что внутренний цикл будет видеть значения i от someArray.length - 1 до 0 (включительно), которые являются всеми индексами этого массива.

Ваш пример кода:

var i = someArray.length;

while (i--) {
    console.log(someArray[i]);
}

создает такой же вывод, как этот:

for (var i = someArray.length - 1; i >= 0; i--) {
    console.log(someArray[i]);
}
5 голосов
/ 25 февраля 2012

Когда i-- достигает 0, цикл останавливается.

Цикл останавливается, когда выражение в while ( ... ) оценивается как ложное.Поскольку i является положительным числом (длиной) и уменьшается, оно в некоторой точке достигнет нуля.

В логическом контексте ноль переводится в false, гарантируя, что цикл останавливается в некоторой точке.Поскольку i-- возвращает значение предыдущего декремента, i на самом деле -1, когда цикл останавливается.

1 голос
/ 25 февраля 2012

Каждый раз при запуске цикла проверяется i--. -- говорит Javascript уменьшить i на 1. В конце концов, i опустится до 0, что эквивалентно false. На этом этапе цикл останавливается.

0 голосов
/ 25 февраля 2012

Принимая удар в темноте, это потому что 0 оценивается как ложное в логическом выражении. 0 == true возвращает false 0 == false возвращает true

Обратите внимание, что если вы начнете с -1, он будет бесконечно зацикливаться.

...