为什么这个'for(;;)'循环会执行?

5

世界上什么会使第二个参数返回true

警告:它将无限循环并可能崩溃您的浏览器

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

我完全没有期望会有任何循环...

但它正在运行,这让情况更糟,因为它只能在某些东西被评估为true时才能运行,或者我错过了什么?


3
如果没有给出任何条件,for循环会一直运行直到你跳出它。这在C语言中也是一样的。 - James M
在Java和JavaScript中,与C和C++一样,特殊的for循环语法是相同的。请参见https://dev59.com/hG445IYBdhLWcg3wXZO9#4894256。 - paxdiablo
3个回答

7

来自forMDN

for ([initialization]; [condition]; [final-expression])
   statement
[Initialization][final-expression]并不是必需的,这使得构造变成了一个简单的while循环。但相关部分如下: condition
每次循环迭代前都要评估的表达式。如果该表达式计算结果为真,则执行语句。这种条件测试是可选的。如果省略,条件总是计算结果为真。如果该表达式计算结果为假,则执行跳过到for结构后的第一个表达式。
上述加粗部分是JS语言设计决策中完全随意的部分。如果它是我的语言,我可能会抛出一个语法错误。
顺带一提,for(;;){}等同于while(true){},而且比后者少4个字符。我不知道缩小器是否利用了这一点!

4
由于缺少条件,将始终计算为真。

真的吗?那有点不专业。这是在Java中到处都是这样工作的吗?就像 if() 一样? - Robert Harvey
@RobertHarvey,语法限制了 if() 不能没有条件,但却没有限制 for() - rid

1

没有“使第二个参数返回true”这样的东西。也没有第二个参数。ECMAScript Language Specification (ECMA-262 5th Edition)的12.6.3节如下所述:

a. 如果第一个Expression存在,则

i. 让testExprRef成为评估第一个Expression的结果。

ii. 如果GetValue(testExprRef)是false,则返回(normalVempty)。

它所指的“第一个Expression”是for语句中分号之间的可选表达式。如果存在,则程序执行上述引用的步骤(i)和(ii)。如果不存在该表达式,则程序简单地不执行for语句算法的步骤(i)和(ii)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接