更新表达式包括 前自增/自减运算符 和 后自增/自减运算符。
前自增:先自增,再赋值
let n = 10;// 前自增const res = ++n;console.log(n);// 11console.log(res);// 11
前自减:先自减,再赋值
let n = 10;// 前自减const res = --n;console.log(res);// 9console.log(n);// 9
后自增:先赋值,再自增
let n = 10;// 后自增const res = n++;console.log(res);// 10console.log(n);// 11
后自减:先赋值,再自减
let n = 10;// 后自减const res = n--;console.log(res);// 10console.log(n);// 9
前自增/前自减与后自增/后自减的异同点:
+1
/-1
为什么后自增后自减优先级很高却后操作?
前置操作返回加(减)1 的值,所以返回对象本身,这是左值(++i
,先自增后操作)
后置操作为右值,同样对其操作数 +1
/-1
,但操作后产生操作数原来的、未修改的值为表达式的结果(可理解为 i++
为先操作,后自增)。实际上,由于后自增(减)优先级很高,因此会先自增(减),但在自增(减)前会创建一个副本,用来保存操作数原来的值,操作后会返回副本的值给表达式。
建议:只有在必要时才使用后置操作符,尽量使用前置操作符。因为前置操作需要做的工作更少,而后置操作必须先保存操作数原来的值,对于 int 型对象和指针,编译器会优化掉这项额外的工作,但对于更多复杂的迭代器类型,这种额外的工作可能会花费更大的代价。