輸出以下程式碼的執行結果並解釋為什麼
阿新 • • 發佈:2021-08-04
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x) console.log(b.x)
結果
undefined {n:2}
1:a
和b
同時引用了{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.x
時候的a
,也即舊物件,故此時舊物件的x
的值為{n:2}
,舊物件為{n:1;x:{n:2}}
,它被b
引用著。 後面輸出a.x
的時候,又要解析a
了,此時的a
是指向新物件的a
,而這個新物件是沒有x
屬性的,故訪問時輸出undefined
;而訪問b.x
的時候,將輸出舊物件的x
的值,即{n:2}
。