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}
这行语句的执行过程如下
- 执行前,
a
指向的是{n:1}
的内存地址,a.x
会在{n:1}
创建一个undefined
变量等待赋值, 即{n:1, x:undefined}
- 在内存中创建对象
{n:2}
,等待被引用 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}
依然不会对结果产生影响。