1. 程式人生 > 其它 >輸出以下程式碼的執行結果並解釋為什麼

輸出以下程式碼的執行結果並解釋為什麼

var a = {n: 1};
var b = a;
a.x = a = {n: 2};

console.log(a.x)     
console.log(b.x)

結果

undefined {n:2}

1:ab同時引用了{n:1}物件,接著執行到a.x = a = {n:2}語句;

儘管賦值是從右到左的沒錯,但是.的優先順序比=要高,所以這裡首先執行a.x
相當於為a(或者b)所指向的{n:1}物件新增了一個屬性x,即此時物件將變為{n:1;x:undefined}
2:之後按正常情況,從右到左進行賦值,此時執行a ={n:2}的時候,a的引用改變,指向了新物件{n:2},而b依然指向的是舊物件。之後執行a.x = {n:2}

的時候,並不會重新解析一遍a,而是沿用最初解析a.x時候的a,也即舊物件,故此時舊物件的x的值為{n:2},舊物件為{n:1;x:{n:2}},它被b引用著。 後面輸出a.x的時候,又要解析a了,此時的a是指向新物件的a,而這個新物件是沒有x屬性的,故訪問時輸出undefined;而訪問b.x的時候,將輸出舊物件的x的值,即{n:2}

摘自:第 53 題:輸出以下程式碼的執行結果並解釋為什麼