Почему это циклы for (;;)?

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

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

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

Я вообще ожидал, что не зациклится...

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


person ajax333221    schedule 30.03.2012    source источник
comment
Если условие вообще не задано, цикл for выполняется до тех пор, пока вы не выйдете из него. То же самое и в Си.   -  person James McLaughlin    schedule 30.03.2012
comment
См. stackoverflow.com/questions/4894120/special-for -loop-syntax/ - точно так же в Java и JavaScript, как и в C и C++.   -  person paxdiablo    schedule 30.03.2012


Ответы (3)


Из forMDN< /а>

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

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

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

(выделено мной)

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


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

person calebds    schedule 30.03.2012

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

person rid    schedule 30.03.2012
comment
Действительно? Это немного странно. Так это работает везде на Java? Как в if() ? - person Robert Harvey; 30.03.2012
comment
@RobertHarvey, синтаксис не позволяет if() не иметь условия, но не предотвращает for(). - person rid; 30.03.2012

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

а. Если присутствует первое Expression, то

я. Пусть testExprRef будет результатом оценки первого Expression.

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

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

person rob mayoff    schedule 30.03.2012