Javascript 连等赋值

一个问题引发的思考

我最初是在 Segmentfault 上看到网友提的这个问题,传送门

var a = {n:1};  
var b = a;
a.x = a = {n:2};  
alert(a.x);// --> undefined  
alert(b.x);// --> {n:2}

第一眼看上去很奇怪,难道根据右结合性 a.x = a = {n:2} 的执行过程不应该是 a = {n:2} 然后 a.x = {n:2} 也就是 a = {n:2, x:{n:2}} 么?

解答

实际上 a.x = a = {n:2} 这行语句的执行过程如下

  1. 执行前, a 指向的是 {n:1} 的内存地址, a.x 会在 {n:1} 创建一个 undefined 变量等待赋值, 即 {n:1, x:undefined}
  2. 在内存中创建对象 {n:2},等待被引用
  3. a 重新指向 {n:2}, a.x 指向 {n:2}, 即 {n:1, x:{n:2}}

可以发现 a 的赋值并不会对 a.x 赋值产生影响。因为 a 赋值改变了原本 a 指向 {n:2} 的地址,而 a.x 中的 a 在此之前已经被取出,依然指向 {n:1} 的地址。所以即使改变等号左右的顺序变为 a = a.x = {n:2} 依然不会对结果产生影响。


本文作者: Vincent0700
本文地址: https://vincentstudio.info/2020/05/09/053_Javascript_continuous_assignment/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!