【问题标题】:Empty for loop - for(;;)空 for 循环 - for(;;)
【发布时间】:2011-09-25 20:38:34
【问题描述】:

我正在探索Google Closure Compiler,我注意到的一件事是它将while(true) 转换为for(;;)

两者都挂起浏览器,但为什么空的for 循环没有立即脱离自身?它的第二部分是空的,因此是虚假的。当第二部分为假时,for 循环停止并继续执行for 循环之后的代码,这不是真的吗?

有人能解释一下吗?

【问题讨论】:

  • 也许它更快...有人应该对它们进行基准测试:)
  • 嗯,它更小——这就是编译器所做的:只是缩小你的代码(它真的是一个很棒的工具)

标签: javascript


【解决方案1】:

不,这不是真的。

见:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

条件

在每次循环迭代之前要评估的表达式。如果这 表达式计算为真, 语句被执行。这个 条件测试是可选的。 如果 省略,条件总是 评估为真。如果表达式 评估为假,执行跳到 for 后面的第一个表达式 构造。

我或许应该提供一个指向 ECMAScript 参考的链接,但我很确定它或多或少地陈述了相同的内容。

【讨论】:

  • 祝你好运。我刚刚经历了ECMA-262 specsfor 循环,它们通常是难以理解的。上述行为是遵循规范中的步骤的结果,而不是它明确规定的结果。
  • 哦,好吧...然后我想 Mozilla 的参考和我的话,所有流行的 ECMAScript 变体都以这种方式运行,这已经足够了。 :D
【解决方案2】:

来自ECMAScript language specification

IterationStatement : for (ExpressionNoIn_opt ; Expression_opt ; Expression_opt) 语句

如果第一个表达式存在,那么

  1. 设 testExprRef 为计算第一个表达式的结果。
  2. 如果 GetValue(testExprRef) 为 false,则返回(正常、V、空)。

由于第一个表达式(for 的第二个参数)不存在,因此该部分永远不会运行,因此 for 循环不会退出。

【讨论】:

    【解决方案3】:

    空的中间部分应该被解释为true,所以它不是假的。它在 C 和其他具有这种循环的语言(如 C#、Java 等)中具有相同的语义。为 JavaScript 更改它将是一个真正的陷阱。

    【讨论】:

    • 我不知道。我也不想让它改变,我只是想知道。
    • @pimvdb:我也明白这一点 :) 我只是想指出这并不取决于 JavaScript 的创建者。他只需要做其他人都在做的事情(或者让很多人感到困惑)。再想一想,我猜他确实让人们感到困惑,但与语言的其他部分:D
    【解决方案4】:

    标准 ECMA-262 脚本中的 for 循环评估算法表明只有两种情况会结束循环:

    1. 中断语句
    2. 中间语句的值等于false但仅当该语句存在时,因此不必将其评估为true (可能在 mozilla js 引擎中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 2020-07-10
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多