公平地说,每个人都学习使用后置增量编写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
并输入循环的主体;打印值为1
的i
以协商;再次评估循环的条件;等等。
然而,输出(至少对于Chrome中的JavaScript)与后置增量相同:0…9
。为什么?增量是在主体运行后执行的吗?
for循环的最后一部分只发生在每个循环的末尾。
所以i
和i
在这种情况下基本上做同样的事情。
操作顺序:
var i = 0;
while (i < 10) {
// do stuff
console.log(i);
// increment i in your own way
++i; // or i++;
}
在后一个示例中,操作序列是
var i = 0; // obviously
if (i < 10) /* proceed */
console.log(i);
++i;
正如你似乎怀疑的那样,“没有说”插队,以完全不同的顺序进行操作。
主体运行后执行增量吗?是的。
看到那些分号了吗?它们意味着它们是完全不同的表达方式。
举个小例子:
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);
啊,因为运算符在相同的表达式中使用,所以我们使用的运算符很重要!
这基本上就是正在发生的事情。因为它们是不同的表达式,想象它们在不同的线上运行。