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

发布于 2022-09-11 22:46:46 字数 476 浏览 32 评论 0

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  。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青朷 2022-09-18 22:46:46
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

老娘不死你永远是小三 2022-09-18 22:46:46

对于 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,你可以根据运算符优先级那个表自行推导了。

冷清清 2022-09-18 22:46:46

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文