我正在探索Google Closure Compiler,我注意到的一件事是它将while(true)
转换为for(;;)
。
两者都挂起浏览器,但为什么空的for
循环不会立即中断?它的第二部分是空的,因此是假的。当第二部分是假的时候,for
循环停止并继续执行for
循环之后的代码,这是不是真的?
有人可能会对此作出解释吗?
答案 0 :(得分:21)
不,这不是真的。
请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for
条件
在每次循环迭代之前要计算的表达式。如果这 表达式求值为true, 声明被执行。这个 条件测试是可选的。 如果 省略,条件总是 评估为真。如果表达 评估为false,执行跳过 for之后的第一个表达式 构造
我或许应该提供ECMAScript参考的链接,但我很确定它或多或少地说明了相同的内容。
答案 1 :(得分:4)
来自ECMAScript language specification:
IterationStatement:for(ExpressionNoIn_opt; Expression_opt; Expression_opt)Statement
如果存在第一个表达式,那么
由于第一个表达式(for的第二个参数)不存在,因此该部分永远不会运行,因此for循环不会退出。
答案 2 :(得分:1)
空的中间部分应该被解释为true
,所以它不是假的。它在C语言和其他语言中具有相同的语义,具有这种循环(如C#,Java等)。为JavaScript改变它将是一个真正的陷阱。
答案 3 :(得分:1)
在标准ECMA-262脚本中有for循环的评估算法,它表示只有两种情况会循环结束: