请问下面js代码,什么是a++的 `后副作用` ?

var a = 42, b;
b = a++;

console.log(a);//43
console.log(b);//42

以及如下js代码
var a = 42, b;
b = a++, a;
a; // 43
b; // 42

js操作符优先级不应该先算a++然赋值给b吗?a逗号隔离了应该还是42啊
谷歌也没找到,请详细解释一下a++的 后副作用

原书的解释,其中a++的 后副作用 是什么鬼???:

等一下!为什么这改变了赋给 b  的值?
因为 ,  操作符要比 =  操作符的优先级低。所以, b = a++, a  被翻译为 (b = a++), a  。因为
(如我们前面讲解的) a++  拥有 后副作用,赋值给 b  的值就是在 ++  改变 a  之前的值 42  。

重点不是优先级。。。。。

阅读 3.2k
3 个回答
b=(a++,a)

这一段,因为执行了 a++ 后 a 已经是 43 了,但是根据 逗号操作符 始终将最右边的返回出去,所以这里返回的是

b=(a++,a)

再看

b=a++,a

是否记得逗号还有个作用:分别赋值。

var a = 0;
var b = 0;
var c = 1;
// 简写
var a = b = 0,c = 1;

这是其一,剩下的就是,a++++a 的问题,根据运算, b = a++; 其实是如下。

b = a++;
b = a;
a = a + 1;
// 如果是 ++a 
b = ++a;
a = a + 1;
b = a;

clipboard.png

对于 b = (a++, a),发生了以下的事:

  1. 这里面出现的运算符有:=()a++(后置递增)、, 四种,它们的优先级为:

    () > a++ > = > ,
    -- 运算符优先级 - JavaScript | MDN
  2. 但是由于 a++,() 所包裹,所以 b = (a++, a) 的实际运算顺序为:

    1. a++
    2. a++, a
    3. b = (a++, a)
  3. 按顺序进行求值

    1. a++,这是一个后置的递增运算符,所以会先返回 a 的值然后再对 a 的值进行 + 1(所谓的 后副作用);
    2. a++, a 就变成了 42, 43
    3. 42, 43 这是一个逗号操作符,它会返回最后一个操作数的值(这里是 43),所以把第二步的结果代入,这一次计算会返回 43
    4. b = 43

对于 b = a++, a,你可以根据运算符优先级那个表自行推导了。

你这是 逗号表达式 的问题,另外说下++的区别
a++是先用后加
++a是先加后用

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