var a = {n:1}//1
var b = a//2
a.x = a = {n:2}//3
console.log(a.x)//undefined
console.log(b.x)//{n:2}
前提基礎(chǔ)知識(shí)點(diǎn):
- 引用類型賦值:
- 引用類型復(fù)制的時(shí)候建椰,兩個(gè)變量作為指針指向同一個(gè)對(duì)象
- 變量賦值的時(shí)候是將該變量指向另一個(gè)對(duì)象
- 通過點(diǎn)表示法,訪問修改屬性的時(shí)候岛马,所指向的對(duì)象地址不變
- 操作符
- 點(diǎn)操作符號(hào)的優(yōu)先級(jí)很高,僅次于(),方向是從左到右
- 賦值操作符的方向是從右到左屠列。
操作符參考鏈接:MDN
現(xiàn)在來分析上面的代碼啦逆,1、2兩句將a笛洛、b這兩個(gè)變量都指向{n:1}
(對(duì)象A)這二個(gè)對(duì)象夏志,主要令人困惑的是第三句代碼,由于.
操作符的優(yōu)先級(jí)a.x
最先執(zhí)行,即是給{n:1}
添加一個(gè)x屬性苛让,因此它變成{n:1,x:undefined}
(對(duì)象A),然后再執(zhí)行a = {n:2}
沟蔑,即是將a指向另一個(gè)對(duì)象{n:2}
(對(duì)象B),此時(shí)a和b已不是指向同一個(gè)對(duì)象了狱杰,最后執(zhí)行a.x = a
瘦材,可以理解為將對(duì)象A的屬性x指向了對(duì)象B。因此
a.x = undefined
b.x = {n:2}
畫一個(gè)圖一目了然: