var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x);//undefined
console.log(b);
輸出結(jié)果為
console.log(a.x);//undefined
console.log(b);//Object {n: 1 x: {n: 2}}
看的我有點懵,不是剛給a.x賦值了么,怎么轉(zhuǎn)眼就undefined了呢?
看到網(wǎng)友結(jié)構過程是這樣的。
1.給a賦值,a作為一個對象指向{n:1}.
var a = {n: 1};
2.b和a共同指向{n:1}
var b = a;
3.關鍵在第三行的拆解
a.x = a = {n: 2};
等價于
a.x = (a = {n: 2});
傳統(tǒng)編程語言認為a.x的結(jié)果就是括號運算的結(jié)果,但js卻偏不。
首先計算a.x,因為之前我們并沒有給a聲明成員x,所以a.x運算的結(jié)果就是,給a和b執(zhí)行的{n:1}聲明一個成員,即{n:1,x:undefined},因為還沒賦值,所以值是 undefined.
接著計算a={n:2},這個操作,會使得a開始指向{n:2},而不再是{n:1,x:undefined}。也就是說a移情別戀了,現(xiàn)在指向{n:1,x:undefined}只剩下了b。
那么最終對{n:1,x:undefined}里面的x賦值,只對b有效。所以最終打印a.x針對的是{n:2}這個對象,當然是undefined。而b里面的x賦值順利完成為{n:2},即b最終值為{n:1,x:{n:2}}.
js果然自成一派。