【问题标题】:Why have for-loops with pre-increment the same behaviour as those with post-increment?为什么具有预增量的 for 循环与具有后增量的循环具有相同的行为?
【发布时间】:2016-08-10 19:41:53
【问题描述】:

可以公平地说,每个人都在学习使用后增量编写 for 循环:

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 并进入循环体; iwith value 1 打印到控制台;再次评估循环的条件;等等

但输出(至少对于 Chrome 中的 JavaScript)与后增量相同:0..9。这是为什么?是否在 body 运行后执行增量?

【问题讨论】:

  • 循环体运行后更新。
  • 您需要了解循环的工作原理。引擎进入循环它初始化变量并检查退出条件。一旦它处理完循环中的指令,它就会进行增量,检查退出条件等。这就是为什么使用前或后增量没有真正的区别
  • @jeff 表示后期增量,这很清楚。但是对于一个预增量,我的直觉让我误入歧途。谢谢大家的解释。

标签: javascript for-loop post-increment pre-increment


【解决方案1】:

for 循环的最后一部分只发生在每个循环的结束

所以++i i++ 在这种情况下基本上做同样的事情。


操作顺序:

var i = 0;

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

【讨论】:

    【解决方案2】:

    在后一个例子中,操作顺序是

    var i = 0; // obviously
    if (i < 10) /* proceed */
    console.log(i); 
    ++i;
    

    “++”并没有像您所怀疑的那样说“跳过队列并以完全不同的顺序执行操作”。

    【讨论】:

    • 如果检查发生在之前控制台日志。
    【解决方案3】:

    是否在body运行后执行增量?是。

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

    举个小例子:

    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);
    

    啊,既然运算符都用在了same表达式中,那我们用的那个很重要!

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

    【讨论】:

    • 增量发生在控制台日志之后。
    • @Tuvia。显然,我的示例并不是复制循环,它们是出于演示目的,展示了 for 循环被分成多个语句这一事实的概念。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多