REPL with Node 中 ++ 和 += 1 的区别

Difference between ++ and += 1 at the REPL with Node

counter  = 1;
time = 60;

while (counter < time) {
    console.log(counter);
    counter += 1;
}

为什么上面REPL中code的值是1到60

而下面 REPL 中代码的输出是 1 到 59:

counter  = 1;
time = 60;

while (counter < time) {
    console.log(counter);
    counter++;
}

我测试了 REPL 中的两个代码。

因为node REPL默认打印出上一条命令的结果

在你的第一种情况下,最后一个命令是 counter++,它将计数器增加到 60 和 returns 59

在第二种情况下,最后一个命令是count += 1,它将计数器增加到60和returns 60

在Chrome开发者控制台运行里面更清楚

node REPL的情况下,你仍然可以看到最后一个数字有不同颜色的区别,表明它是最后一次评估的值而不是console.log[=17=的输出]

在Javascript中,counter++会return递增前的值。但是,它仍然会像 +=1 一样递增计数器。

因此您的 while 循环将在完全相同的点处中断,这就是为什么所有白色文本都是相同的 - 所有 console.logs() 都打印相同的内容。然而,在 console.log 循环之后,Node 正在做一些特别的事情。它以黄色打印循环中最后一个 returned 值,+=1 代码是 60,而 ++ 代码是 59。

FWIW,这是一个很好的问题,反对者羞辱了 Whosebug。

这两段代码的行为完全相同。 a++; 作为语句与 a += 1;

具有完全相同的效果

如果您遇到问题,它们源于您向我们展示的示例代码之外。

a++a += 1 之间的区别仅在于 returned 值,您在示例中 而不是 代码。 a++ 的 returned 值是 a 递增前的值。 a += 1 的 returned 值是 a 递增后的值。但是,这种差异不会在您的代码中体现出来,因为您没有要求它的 return 值。

您在简化示例代码的方式上犯了一个错误。您示例中的两段代码将表现相同。

我认为“+=1”和“++”在您的代码中的作用相同。

不过,其实还是有点区别的

例如,在下面的代码中。

a = 1
b = a+=1 
console.log(a,b)

2 2

a = 1
b = a++
console.log(a,b)

2 1

在这两种情况下,您的循环仅输出 159,但是,节点 REPL 还输出最后一个计算表达式的结果。

在第一种情况下,最后计算的表达式是 (counter += 1),计算结果为计数器 (60) 的新值,而在第二种情况下,最后计算的表达式是 (counter++),计算结果为增量前计数器的值 (59)。如果仔细观察,您会发现 59 在第二个版本的输出中出现了两次(一次由 console.log 打印,一次由 REPL 打印。

如果你不相信,试试这个:

counter  = 1;
time = 60;

while (counter < time) {
    console.log(counter);
    counter += 1;
    'Hello!';
}

在您的终端上执行的最后一个命令将默认打印,因此如果您在分配数字后 console.log.. 您将得到预期的结果。