更好地理解JavaScript以实现循环

更好地理解JavaScript以实现循环,javascript,for-loop,Javascript,For Loop,在从JS编辑器()读取代码时,我遇到了for循环的各种用法,如下面的代码片段所示: 代码段1@: 代码片段2@ 同样,我也遇到了一个带有空主体的for循环,例如: for (var p; p; p = someValue) /* empty body */ ; 我试图了解代码执行流中发生了什么 我的看法是,对于代码段1中的代码,for循环没有条件,所以它可能会无限期地继续下去?对于代码段2中的代码,i连续递增而没有限制?对于第三个循环,循环将继续,直到p被赋值为false 这些是我脑海中的想法

在从JS编辑器()读取代码时,我遇到了for循环的各种用法,如下面的代码片段所示:

代码段1@:

代码片段2@

同样,我也遇到了一个带有空主体的for循环,例如:

for (var p; p; p = someValue) /* empty body */ ;
我试图了解代码执行流中发生了什么

我的看法是,对于代码段1中的代码,for循环没有条件,所以它可能会无限期地继续下去?对于代码段2中的代码,
i
连续递增而没有限制?对于第三个循环,循环将继续,直到
p
被赋值为
false

这些是我脑海中的想法,但我不确定。请协助。

简而言之 首先,你所有的断言都是正确的

  • 第一个循环一直运行,直到突然退出(包括中断、返回、抛出等)
  • 第二个循环运行,直到突然退出,但也执行变量赋值,并增加一个值
  • 第三个for循环像正常的for循环一样运行,直到中心条件为false。它的身体是空的

但是为什么JavaScript会这样做呢? 让我们深入了解一下为什么会发生这种情况

如果我们仔细观察,我们可以看到以下情况在for循环中发生:

迭代语句:for(ExpressionNoIn(opt);Expression(opt);Expression(opt))语句

我将在回答的其余部分处理这些陈述和定义

现在让我们看一下这些案例

如果(;;)的
之一发生以下情况:
  • ExpressionNoIn不存在,因此该条款不需要任何内容(如第1条所述)

  • 第二个表达式不在中,因此我们不返回调用(如第3条所述)

  • 第三个表达式为空,因此不执行“增量”(如第3.f条所述)

所以它基本上会像你预测的那样无休止地重复(直到用
break
中断,或者从中返回,或者从中抛出,通常是导致突然完成的任何东西)。(如e和d条所述)

在第二种情况下(var i=0;;++i)
发生以下情况:
  • ExpressionNoIn是存在的,所以我们对它求值,并用get值赋值(如第1条所述)。我们不分配它

  • 然后我们不断重复,因为第二个表达式不在这里。所以我们继续,直到突然执行或中断。更具体地说,这是定义

  • 我们在每次迭代中增加
    i
    ,如子句f所述

在第三种情况下,
for(var p;p;p=someValue)/*空体*发生以下情况:
这将作为for循环进行计算。语句确实是空的,但for循环并不真正关心。唯一的区别是for循环没有返回任何值。基本上,这是一个完整的、合法的for循环<代码>
只是一个空语句。当您想要在实际循环中没有内容的情况下运行for循环时,它非常有用。你有时会在特征检测中看到这一点。当您希望找到最小值
n
时,这也很有用,以便

您的判断是正确的,它一直运行到值为false,或者更准确地说是
false
。如第3.a.ii条所述

如您所见,这都在规范中,并且定义得很好:)


为什么程序员会这样做? 在第一个代码段中使用执行流控制<代码>如果(下线>=pos | |下线<0)中断(他们检查行尾,这可以在更传统的for循环中完成)

在第二个代码段中,他们再次使用break执行流控制:

 if (!definitions.hasOwnProperty(uniq)) { name = uniq; break; }
他们再次将其放入for循环中的break语句中

第三个代码片段与上下文无关,但假设我们想(一个简单的例子)找到大于10的第一个数字(或第10个div元素,或字符串的出现-你明白了)。我们可以做到:


对于(var i=0;i而言,您的理解是正确的

第一个片段是一个无限循环;没有终止条件,因此循环(本身)将永远继续。这几乎肯定伴随着正文中的某个
break
语句,该语句将在循环运行时退出循环。(另一个选项是抛出的异常退出循环,尽管将异常用作控制流是不好的做法。)此模式(或等效的
while(true){…}
)通常在退出条件过于复杂而无法在循环语句中表达时发生

第二个代码段与第一个类似,没有终止条件,它将永远运行。这还需要一个
break
语句(或异常)来终止循环。这里唯一的区别是每次迭代时计数器变量也会递增

第三个代码段是一个没有正文的循环,尽管测试和变量更新在循环的每次迭代中都会发生。正如您所料,这将一直持续到
p
的计算结果为
false
。此for循环与while循环版本完全相同:

var p;
while (p) {
    p = someValue;
}

这也许可以让我们更清楚地看到,任务会重复进行,直到你的回答正确为止。前两个循环可以在他们体内出现
中断
时完成。你为什么不使用
while(true)
?@Nate,例如在(;;)打代码高尔夫球
较短:P老实说,对于(;;)
没有很好的理由使用
我解释了为什么它会这样,而不是为什么人们会在代码中使用它。
 if (!definitions.hasOwnProperty(uniq)) { name = uniq; break; }
var p;
while (p) {
    p = someValue;
}