var a = {n:1}
var b = a;
a.x = a = {n:2}
console.log(a.x)//undefined
console.log(b.x)//{n:2}
為什么會出現(xiàn)這樣的結(jié)果呢斜姥?不是應(yīng)該等號右邊一路賦值過來的嗎惑惶,應(yīng)該是下面這樣的邏輯才對啊...
var a = {n:1}
var b = a;
a = {n:2}
a.x = a;
console.log(a)//{n:2,x:{...}}
console.log(b)//{n:1}
這種結(jié)果就是按照正常思維的處理順序,先把{n:2}給a凄吏,然后a.x再引用a远舅,形成一個回環(huán)引用,但顯然這樣的邏輯是對不上結(jié)果的痕钢,那原因是什么呢图柏?
第一步、先計算.運算符
由于一開始a和b變量指向的都是{n:1}這個對象任连,然后執(zhí)行了這個對象的.運算符蚤吹,其實此時當(dāng)前這個{n:1}對象變成了
{
n:1,
x:undefined
}
第二步、a指向了新的地址{n:2}
第三步随抠、確定a.x中的a到底是{n:1}還是{n:2}
答案是{n:1},因為一開始計算.運算符的時候,a就指的是{n:1}第练,這里有一個解析的過程瑞妇,所以a.x = {n:2}實際上就是給原本為undefined的x賦值了而已
{
n:1,
x:{
n:2
}
}
總結(jié)
連續(xù)賦值,遇到這種變量名字還都一樣的情況需要注意的是這個a的指向秉沼,因為計算了.的緣故桶雀,a指向的還是原本的對象
示意圖