var a = {n: 1}; // a保持對{n:1}物件的引用
var b = a; // b保持對{n:1}物件的引用
a.x = a = {n: 2}; // a的引用被改變
a.x // --> undefined
b.x // --> {n: 2}
1、.運算子優先,a.x此時保持對堆記憶體{n: 1}的引用,也就是b也保持對堆記憶體{n: 1}的引用,
於是堆記憶體{n: 1} => {n: 1, x: undefined},此時a和b還是對原來物件的引用,只不過原來物件增加
了x屬性
2、=從右往左,a = {n: 2},此時a的引用已經變成了{n: 2}這個物件
3、a.x=a,此時a.x是保持對{ n: 1, x: undefined}中的x引用,也就是b.x,
於是{ n: 1, x: undefined} => {n: 1, x: { n: 2}},即b.x = { n: 2 }
複製程式碼
注意點: 1: 點的優先順序大於等號的優先順序 2: 物件以'指標'的形式進行儲存,每個新物件都是一份新的儲存地址-堆記憶體