【发布时间】:2017-06-11 07:39:43
【问题描述】:
在 JS 中,我偶然发现了一种 for 循环,它是 for(;;),其功能类似于 while(true) 循环。这个for循环括号中的分号有什么作用?
【问题讨论】:
-
你接受什么答案?有几个很好的答案
标签: javascript for-loop
在 JS 中,我偶然发现了一种 for 循环,它是 for(;;),其功能类似于 while(true) 循环。这个for循环括号中的分号有什么作用?
【问题讨论】:
标签: javascript for-loop
for (statement 1; statement 2; statement 3) {
code block to be executed
}
语句 1 是可选的,在循环(代码块)开始之前执行。
var i = 0;
var length = 10
for (; i < length; i++) {
//The for loop run until i is less than length and you incerement i by 1 each time. javascript doesnt care what you do inside, it just check whether you have variable with name i and length
}
语句 2 再次是可选的,定义了运行循环(代码块)的条件。
var i = 0;
var len = 100;
for (i = 5; ; i++) {
//Here you are just initializing i with 5 and increment it by 1 there is no break condition so this will lead to an infinite loop hence we should always have a break here somehwere.
}
语句 3 是可选的,每次循环(代码块)执行后都会执行。
var i = 0;
var length = 100;
for (; i < length; ) {
//Here you are just checking for i < length which is true. If you don't increment i or have an break it will turn into infinite loop
}
简而言之,当您没有条件或初始化时,它会变成无限循环。
【讨论】:
for循环由三部分组成:
for (INITIALIZATION; CONDITION; AFTERTHOUGHT)
{
}
如果省略这些部分,则整体将被评估为:
for(; true ;)
{ }
初始化和事后思考被忽略了。
【讨论】:
通常,一个for循环头包含3部分:
for (var i = 0 ; i < 10 ; i++)
// ^^^^^^^^^ ^^^^^^ ^^^
您首先初始化一个变量,检查条件,如果为真,执行循环体所说的任何操作,然后递增 i。
您可能不知道 for 循环标头的任何部分都可以省略。如果省略第一部分,则不会初始化任何变量。如果第二部分被省略,则没有条件检查。它总是假设条件为真。
所以for(;;) 基本上是一个无限循环,因为它省略了 for 循环头的条件部分。每次,条件都为真,所以它会一直持续下去。
【讨论】:
for ( init; condition; increment )
{
statement(s);
}
这是for循环中的控制流程:
init 步骤首先执行,并且只执行一次。此步骤允许您声明和初始化任何循环控制变量。此处无需声明,只要出现分号即可。
接下来,评估条件。如果为真,则执行循环体。如果为 false,则循环体不执行,控制流跳转到 for 循环之后的下一条语句。
在 for 循环体执行后,控制流程跳回到 increment 语句。此语句允许您更新任何循环控制变量。该语句可以留空,只要条件后出现分号即可。
现在再次评估条件。如果为真,则执行循环并重复该过程(循环体,然后递增步骤,然后再次测试条件)。条件变为假后,for循环终止。
【讨论】:
第一个分号结束初始化语句。
第二个分号结束条件检查语句。
在你的情况下,这两个语句都是空的(没有初始化,每个循环都不检查)。
【讨论】:
好吧,我只是猜测一下。 通常一个 for 循环可能是这样的:
for (i = 0; i < 10; i++)
基本上是这样
for (;;)
永远都很好,因为循环条件总是得到满足。
【讨论】:
我还能补充的是:
引用source,
此条件测试是可选的。如果省略,则条件始终为真。
我们可以将这三个块中的任何一个留在循环中for,
for 的这种行为的信息类似于 C 语言和其他受 C 启发的语法,例如 C++ em>、Java 等,
let i = 1;
for (;;) {
if (i === 4) {
break;
}
console.log(i++);
}
for 循环之后的语句块也是可选的(我们只需要将; 放在末尾即可)。为了说明这一点,下面是下一个示例:相当于上面的代码,但在 for 循环中没有块状态:for(var i = 1; i < 4; console.log(i++));
【讨论】: