a++与++a
先来看一段代码
var a=1;
var b=a++;
console.log(b); //1
console.log(a); //2
a=1;
b=++a;
console.log(b); //2
console.log(a); //2
为什么++a和a++输出结果不同?为什么再次输出a结果却一样?
首先,我们要了解:++a和a++的作用都是给a加上1,但是它们的执行顺序不一样:
- a++:执行表达式后再进行自增运算,返回的a为a+1
- ++a:进行自增运算后再执行表达式,返回的a为a+1
上面代码的a++,先将a赋值给了b,此时a还未自增运算,因此输出为1;至于++a,则是a先进行了自增,再赋值给b,因此输出了2。
a+++a与a+a++
下面再看一段代码
a=1;
console.log(a+++a);
a=1;
console.log(a+a++);
它会输出什么呢? 按照上面写的,应该是a++得到1,此时a++还没执行完整个表达式,a还未自增运算,因此上面表达式输出值是2,同理可得下面输出值也是2。但事实是上面表达式输出值为3,下面表达式输出值为2。
这是编译器的问题
- 计算a+++a时,按照计算从左至右的顺序,先push(a++),相当于push(1),a自增成2可以想象成push(a++),a++就相当于一个独立的表达式,它执行完这个表达式后进行自增运算,因此在编译器里a已经进行自增得到2,接着push(a),相当于push(2),最后pop()出两个操作数,得到pop()+pop(),即是1+2=3;
- 计算a+a++时,按照计算从左至右的顺序,先push(a),相当于push(1),接着push(a++),相当于push(1)之后a自增为2,最后pop()出两个操作数,得到pop()+pop(),即是1+1=2;