javascript:自增++/自减--运算符的小问题?

MDN-运算符优先级上,后置自增a++比前置自增++a有更高的优先级,这是什么原因?

例如:

var a = 1;
var b = ++a;
//=> b = 2;

那么:

var a = 1;
var b = a++;
//=> b = 1;

表面看起来是++a优先级高于=,而a--优先级低于=。这是什么原因呢?

阅读 4.3k
5 个回答

javascript中的运算符优先级,你可以理解为结合优先级,javascript永远是从左向右执行。
赋值表达式中 =++ 的优先级关系不成立,不会因为 ++ 优先级高,而先于 = 计算,只是先于结合。
= 的运算方法查看ECMAScript 5.1 中 11.3.1

b = ++a; 可以理解为:

var a = 1;
var b = fun();
function fun() {
    a = a + 1;
    return a;
}

b = a++; 可以理解为:

var a = 1;
var b = fun();
function fun() {
    var t = a;
    a = a + 1;
    return t;
}

可以参考 ECMAScript 5.1 规范(中文版部分规则缺失):
中文版:http://lzw.me/pages/ecmascrip...
英文版:http://www.ecma-international...

附录D中有说明:

11.8.2,11.8.3,11.8.5:ECMAScript 总体上是以从左到右的顺序解释执行,但是第 3 版规范中 > 和 <= 运算符的描述语言导致了局部从右到左的顺序。本规范已经更正了这些运算符,现在完全是从左到右的顺序解释执行。然而,这个对顺序的修改,如果在解释执行过程期间产生副作用,就有可能被观察到。

ECMAScript 中所有代码均为从左到右进行执行(评估顺序 evaluation order) ,如果你的函数中有副作用时,例如问题中的代码,则可以明确观察到“从左到右”。例如该问题:
https://segmentfault.com/q/10...

运算符优先级和评估顺序是2个不同的概念,sqrt(9) + sqrt(16) * sqrt(25) 中乘法先运行时错误的,表达式总是从左到右运行,只是遇到 * 运算符时,会优先结合。

执行过程类似如下:

  1. sqrt(9)
  2. sqrt(16)
  3. sqrt(25)
  4. 4 * 5
  5. 3 + 20

递增 (++)
递增运算符为其操作数增加1,返回一个数值。

如果后置(postfix)使用,即运算符位于操作数的后面(如 x++),那么将会在递增前返回数值。
如果前置(prefix)使用,即运算符位于操作数的前面(如 ++x),那么将会在递增后返回数值。

++a返回2,所以b=2
a++返回1,所以b=1
和优先级无关

其实关注这些没有特别的意义,如果不确定,就加括号,而++只在单目中使用,而不要用太多奇技淫巧。

其他人说的都不对
a+++b会被识别为(a++)+b而不是a+(++b)
后置自增比前置自增有更高的优先级,是表现在这里的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题