首先来看两个例子
let x = 1
console.log( x+++x ) //输出3,x=2
let x = 1
console.log( x+x++ ) //输出2,x=2
那么问题来了,为什么得到的答案不同呢?
这个问题涉及到的就是前置自增(减)运算符和后置自增(减)运算符还有运算符的优先级问题了。
前置自增(减)运算符和后置自增(减)运算符
首先我们来看x++与++x有什么区别。
来看这两个例子:
let x = 1
console.log( x++ ) //输出结果是1,x = 2
let x = 1
console.log( ++x ) //输出结果为2,x = 2
我们可以看到,x++是先赋值1,进行计算输出完成之后,才进行自增1。而++x是先进行自增1,再进行赋值计算。
所以上面的x++是以未自增的状态,也就是1进入计算输出得到1,然后才进行自增,变为2。而++x是先进行自增,x变成2,再代入计算输出,得到2。
自减运算符也是一样的道理,这里就不多赘述了。
运算符的优先级
那么我们怎么区分x+++x是(x++)+x还是x+(++x)呢?亦或我们怎么区分x+x++是(x+x)++还是x+(x++)呢?
这就要牵扯到运算符的优先级上去了。 我们打开MDN的JS文档,就可以看到运算符的优先级。developer.mozilla.org/zh-CN/docs/…
我们可以在汇总表看到,后置递增和后置递减(也就是x++和x--)的优先级是16。
而前置递增和前置递减(也就是++x和--x)的优先级是15。也就是前置递增(减)要在后置递增(减)的后面进行计算。
还有,加法 (+)的运算符优先级在12,远低于前置递增(减)和后置递增(减)。
所以我们文章开头的两个例子应该是(x++)+x和x+(x++)。
我们再回来看这两个例子
let x = 1
console.log( x+++x ) //首先后置++的优先级比+要高,所以我们先进行x++的输出。
x++先输出为1,之后再自增为2。然后进行加法,也就是x++为1,x自增1变为2,x+++x就等于1+2为3,而x为2。
let x = 1
console.log( x+x++ ) //首先后置++的优先级比+要高,所以我们先进行x++的输出。
x++先输出为1,之后再自增为2。然后进行加法,也就是x++为1,运算是从左往右开始的,x在x++左边,也为1,
所以就是1+1,结果为2。而x也在最后自增成2。