Почему этот цикл for (;;)? - PullRequest
5 голосов
/ 30 марта 2012

Что в мире заставляет второй параметр возвращать true?

ВНИМАНИЕ: он будет бесконечно зацикливаться и может вызвать сбой вашего браузера

for(;;){
    //...
}

Я полностью ожидал, что цикл вообще не будет ...

Но он работает, и это делает его хуже, поскольку он может работать, только если что-то оценивается как true, или ячто-то упустил?

Ответы [ 3 ]

7 голосов
/ 30 марта 2012

С for MDN

for ([initialization]; [condition]; [final-expression])
   statement

[Initialization] и [final-expression] интуитивно не требуются, сводя конструкцию к простой петле while. Но соответствующая часть:

состояние
Выражение, которое будет оцениваться перед каждой итерацией цикла. Если это выражение имеет значение true, оператор выполняется. Этот условный тест не является обязательным. Если опущено, условие всегда оценивается как true. Если выражение оценивается как false, выполнение переходит к первому выражению, следующему за конструкцией for.

(акцент мой)

Похоже, это совершенно произвольное решение по проектированию языка JS. Если бы это был мой язык, я бы, вероятно, выдал синтаксическую ошибку.


На игривом примечании for(;;){} эквивалентно while(true){} и на 4 символа короче. Интересно, используют ли минифинеры это!

4 голосов
/ 30 марта 2012

Поскольку отсутствие условия всегда будет оцениваться как истинное.

1 голос
/ 30 марта 2012

Нет ничего «заставляющего второй параметр возвращать true». Там нет второго параметра. Раздел 12.6.3 Спецификации языка ECMAScript (ECMA-262, 5-е издание) гласит:

а. Если присутствует первое выражение , то

я. Пусть testExprRef будет результатом вычисления первого Выражение .

II. Если GetValue ( testExprRef ) равен false , вернуть (normal, V , empty).

«Первое выражение », на которое оно ссылается, является необязательным выражением между точками с запятой в выражении for. Если он присутствует, программа выполняет шаги (i) и (ii), указанные выше. Если выражение отсутствует, программа просто не выполняет шаги (i) и (ii) алгоритма оператора for.

...