說出以下代碼運行結(jié)果
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)
輸出:
undefined
n:2
解析:
var a = {n: 1} ? ?// 定義變量 a 為一個新對象,且這個新對象有一個值為 1 的 n 成員
var b = a; ? ?// 定義變量 b 乏苦,并且讓 b 也引用變量 a 的對象
// 經(jīng)過上面這兩句之后据沈,變量 a 和 b 都引用了對象 {n:1}
// 下面這句是問題的關(guān)鍵
a.x = a = {n: 2}
// a.x = 表示要給 a 引用的那個對象 {n:1} 的 x 成員賦值
// 實際上,此時變量 b 也引用了這個對象 {n:1}
// 此時摔刁,JavaScript引擎首先給 {n:1} 添加一個空的 x 成員俄认,即:{n:1,x:undefined}
// 接下來要給{n:1,x:undefined}.x 賦的是什么值呢电媳?
// 要賦的值是 a = {n: 2}
// 也就是先讓變量 a 引用一個新的對象 {n:2}
// 然后再把 a 的新值賦給 {n:1,x:undefined}.x
// 所以原來的那個對象變成了 {n:1,x:{n:2}}
// 由于變量 b 始終引用那個原來的對象,所以 b 的值是 {n:1,x:{n:2}}
// 由于變量 a 被賦予了一個新的對象锻全,所以 a 的值是 {n:2}
// 這面這兩句是控制臺輸出
console.log(a.x); ? ?// 變量 a 引用的對象是 {n:2}奸攻,沒有 x 成員蒜危,所以輸出 undefined
console.log(b.x); ? ?// 變量 b 引用的對象是 {n:1,x:{n:2}},所以輸出 {n:2} ?