Подтвердить что ты не робот

Пустой для цикла - for (;;)

Я изучал Google Closure Compiler, и я заметил, что он преобразует while(true) в for(;;).

Оба действительно зависают в браузере, но почему пустая цепочка for не срабатывает сразу же? Вторая его часть пуста и, следовательно, ложна. Не правда ли, что, когда вторая часть ложна, цикл for останавливается и выполнение продолжается с кодом, который приходит после цикла for?

Может ли кто-нибудь дать объяснение этому?

4b9b3361

Ответ 1

Нет, это неверно.

Смотрите: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

условие

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

Я должен, возможно, дать ссылку на ссылку ECMAScript, но я уверен, что она говорит о более или менее одинаковой вещи.

Ответ 2

Из Спецификация языка ECMAScript:

IterationStatement: для выражения (ExpressionNoIn_opt; Expression_opt; Expression_opt)

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

  • Пусть testExprRef является результатом вычисления первого выражения.
  • Если GetValue (testExprRef) ложно, верните (нормальный, V, пустой).

Поскольку первое выражение (второй аргумент для) отсутствует, этот раздел никогда не запускается, поэтому цикл for не выходит.

Ответ 3

Пустая средняя часть должна интерпретироваться как true, поэтому она не является ложной. Он имеет ту же семантику на C и других языках с таким циклом (например, С#, Java и т.д.). Это была бы настоящая ловушка, чтобы изменить ее для JavaScript.

Ответ 4

В стандарте ECMA-262 script имеется оценка algorothm for for loop, в которой говорится, что существует только две ситуации, в которых цикл заканчивается:

  • оператор break
  • значение среднего оператора равно false, , но только если этот оператор присутствует, поэтому он не обязательно должен быть оценен как истинный (возможно, в mozilla js engine он есть).