今天群里面討論了一個小問題
var a = {n:1}
var b = a
a.x = a = {n:2}
console.log(a.x) // ?
console.log(b.x) // ?
一開始我的想法是
// 按賦值運算符優(yōu)先級
a = {n:2}
a.x = {n:2}
// b指向a的值
// a.x {n:2}
// b.x {n:2}
正確答案是:
console.log(a.x) // undefined
console.log(b.x) // {n:2}
為什么會是這個答案呢莺禁?
首先兴想,需要了解的是幢哨,js變量賦值,傳遞的不是變量的標識符地址嫂便,而是變量的值捞镰。基本類型(字符串顽悼、數(shù)字曼振、布爾類型)進行值的復制,引用類型(對象)進行值的地址的引用蔚龙。
var aString = 'abc'
var bString = aString // 值拷貝
var aObj = {n:1}
var bObj = aObj // 變量bObj 指向aObj 的值 : {n:1}
aObj.a = 1 // aObj 的值為 {n:1,a:1}
console.log(bObj) // {n:1,a:1}
aObj = {c:1} // aObj 的值為 {c:1}
console.log(bObj) // {n:1,a:1}
// 值是復雜類型時冰评,變量賦值是值的地址的拷貝
回到前面的問題,
var a = {n:1}
var b = a // b指向?qū)ο髙n:1}
// 這里是重點
a.x = a = {n:2}
// a = {n:2} 使a指向?qū)ο髙n:2}
// 但同一行內(nèi)連續(xù)賦值的話
// 最前面的a.x 的a 并沒有因為 后面的 a = {n:2} 改變指向
// 而是仍指向{n:1} 這個對象
// 因此
console.log(a.x) // a 指向了 {n:2} 此時a沒有屬性x 所以undefined
console.log(b.x) // b 仍指向 {n:1} 而由于前面的a.x操作為它創(chuàng)建了屬性x = {n:2}
// 因此結果是{n:2}
這題重點有兩個木羹,一個是變量賦值的操作甲雅,另一個是當連續(xù)等號賦值操作時,變量對應的值與分開寫的區(qū)別坑填。
方方老師點評:去了解編譯原理抛人,這跟js關系不大
23333