为什么x+++x和x+x++不一样?

639 阅读2分钟

首先来看两个例子

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++)+xx+(x++)

我们再回来看这两个例子

let x = 1
console.log( x+++x ) //首先后置++的优先级比+要高,所以我们先进行x++的输出。

x++先输出为1,之后再自增为2。然后进行加法,也就是x++为1,x自增1变为2,x+++x就等于1+23,而x为2let x = 1
console.log( x+x++ ) //首先后置++的优先级比+要高,所以我们先进行x++的输出。

x++先输出为1,之后再自增为2。然后进行加法,也就是x++为1,运算是从左往右开始的,x在x++左边,也为1,

所以就是1+1,结果为2。而x也在最后自增成2