首先是两个题
var a = {x:1}
var b = a
a = a.x = {x:1}
console.log(a) // a = {x:1}
console.log(b) // b = {x:{x:1}}
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a) // a = {n:2}
console.log(b) // b = {n:1,x:{n:2}}
一、首先连续赋值其实是有顺序的
比如 : A=B=C 它的赋值顺序是 B=C , A=B
二、其次是有一个问题
js内部为了保证赋值语句的正确,会在一条赋值语句执行前,先把所有要赋值的引用地址取出一个副本,再依次赋值。
解析第一个问题
var a = {x:1}
var b = a
所以b = {x:1}
a = a.x = {x:1}
首先B=C,a = {x:{x:1}}, 所以b = {x:{x:1}}
然后A=B,a = {x:1}
所以最终结果为 a={x:1} b={x:{x:1}}
解析第二个问题
var a = {n: 1};
var b = a;
所以b = {n:1}
a.x = a = {n: 2};
首先B=C,因为这里转向新的地址,所以会预先复制一个副本,但是这里是新a = {n:2},然后A=B,原a = {n:2,x:{n:2}} ,所以b = 原a = {n:2,x:{n:2}}。