3
var j=0;
for (i=0;i<100;i++){
    j=j++;
}
console.log(j);

image.png

以上的输出的结果是 0;先看来看看他们的语法定义:

前置递增递减 ++i / --i

执行前置递增和递减操作时,变量的值都是在语句被求值以前递减递增的。(在计算机科学领域,这种情况通常被称作副效应。)请看下面这个例子。

let age=29;
let newAge= --age + 2
console.log(age);
console.log(newAge);

clipboard.png

前置递增递减遇到有赋值操作时: 先递减(29-1),再计算表达式的值(28加上2)

后置递增递减 i++ / i--

后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求值之后才执行的

let age=29;
let newAge= age-- + 2
console.log(age);
console.log(newAge);

后置递增递减遇到有赋值操作时: 先计算表达式的值(29+2=31),再递减(29-1)
clipboard.png

他们有什么区别

先看下面的例子:

var j=0;
for (i=0;i<100;i++){
    j++;
}
console.log(j);

clipboard.png

var j=0;
for (i=0;i<100;i++){
    ++j;
}
console.log(j);

clipboard.png

可以看出 没有赋值等其他操作时, 其实++i与i++是没有区别的
但是,当递增递减语句中包含其他操作时:
前置递增递减:

let num1=1;
let num2=2;
let num3=++num1+num2;
let num4=num1+num2;
console.log(num3);
console.log(num4);

clipboard.png
后置递增递减:

let num1=1;
let num2=2;
let num3=num1++ + num2;
let num4=num1+num2;
console.log(num3);
console.log(num4);

clipboard.png
包括上方的age例子 我们看出同样的求值,出现了不同的结果;
我们可以看出 前置递增使用了递增后的值(num1 递增后为2)同num2相加得到4;后置递增使用了递增前的值(num1为1)同num2 相加得到3
至此,我们就可以可以明白文章开始例子中j=j++; 之后循环的值为什么一直是0

j=j++;可以理解为 j = j 递增前的值; 而递增前的值为0;因此j 每次循环都恒等于0;改为前置递增则可以解决这个问题:

var j=0;
for (i=0;i<100;i++){
    j=++j;
}
console.log(j);

image.png
墙裂推荐,为了方便理解在非在必要条件下建议避免书写i=i++;这样的赋值语句


fsme
781 声望3 粉丝