为什么使用预增量的for循环和使用后增量的for循环有相同的行为?

5

可以说,每个人学习使用后增循环的写法都是公平的:

for(var i = 0; i < 10; i++) {
  console.log(i); // 0..9
}

当我将后增量替换为前增量时,我期望如下所示:
for(var i = 0; i < 10; ++i) {
  console.log(i); // 1..10
}

我的推理如下:i 初始化为 0; 只要 i 小于 10,循环体就会执行;i 加一变成 1,进入循环体;将值为 1i 打印到控制台;再次评估循环条件;以此类推。
然而,输出的结果(至少对于 Chrome 中的 JavaScript)与后缀递增一样:0..9。为什么呢?是将递增操作放在循环体之后执行吗?

1
循环体运行后更新发生。 - Saad
1
你需要理解循环的工作原理。当引擎进入循环时,它会初始化变量并检查退出条件。一旦处理了循环内的指令,它就会执行增量,再次检查退出条件等。这就是为什么使用前缀或后缀增量并没有真正的区别。 - user2417483
@jeff 对于后增量,我很清楚。但是对于前增量,我的直觉误导了我。谢谢大家的解释。 - Christian
3个回答

9

for循环的最后一部分仅在每个循环的结尾发生。

因此,在这种情况下,++i i++ 基本上是相同的。


操作顺序:

var i = 0;

while (i < 10) {
   // do stuff
   console.log(i);
   // increment i in your own way
   ++i; // or i++;
}

-1
在后面的例子中,操作序列是:
var i = 0; // obviously
if (i < 10) /* proceed */
console.log(i); 
++i;

“++”并不是像你所怀疑的那样“跳过队列并按完全不同的顺序执行操作”。


if检查发生在控制台日志之前。 - Tuvia

-1

在运行主体后,增量是否会被执行? 是的。

看到那些分号了吗?它们意味着它们是完全不同的表达式。

看这个小例子:

var i = 0;
if (i<5)
    i++;
console.log(i);

并且

var i = 0;
if (i<5)
    ++i;
console.log(i);
(这些示例并不复制循环的功能。)你看,你会得到相同的答案,因为就像一个for循环一样,它们是完全独立的表达式。

现在,如果你有:

var i = 0;
i += i++;
console.log(i);

并且

var i=0;
i+= ++i;
console.log(i);

啊,既然运算符在同一个表达式中使用,那么我们使用的运算符就很重要了!

基本上就是这样。由于它们是不同的表达式,可以想象它们在不同的行上运行。


1
控制台日志输出后才会发生增量。 - Tuvia
@Tuvia。显然,我的示例并没有复制循环,它们只是为了演示目的,展示了for循环被分成多个语句的概念。 - aaronofleonard

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