请问下面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  。

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

阅读 345
评论
    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

      • 6.5k

      对于 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是先加后用

          撰写回答

          登录后参与交流、获取后续更新提醒