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} 依然不会对结果产生影响。