var a = {n:1};
var b = a;
a = {n:2};
a.x = a ;
console.log(a.x);
console.log(b.x);
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x);
console.log(b.x);
這兩個問題主要理解兩點就很簡單了。
對象是引用類型,改變賦值只是改變指針的引用。運算符=相當于改變指針的指向。
運算符的優先級。. > =。 即:在a.x = a = {n:2};中,先給對象a添加x屬性,再進行a={n:2}與a.x={n:2}兩個賦值操作。
問題1:
// 變量a 指針指向對象 {n:1}
var a = {n:1};
// 變量b 指針指向對象 {n:1}
var b = a;
// 變量b指針不變,仍指向{n:1}; 變量a指針改為指向對象 {n:2}
a = {n:2};
// 注意運算符的優先級。先給對象a增加x屬性,再給x屬性賦值。此時x屬性的值指向a對象自身。即:a = {n:2,x:a}
a.x = a ;
console.log(a.x); // {n:2,x:a}
// 由于b指針沒變,還是指向{n:1} ,故b.x: undefined
console.log(b.x);
問題2:
var a = {n:1};
// b與a的指針均指向 {n:1}
var b = a;
// 注意運算符優先級`.` > `=`
// 先給a添加x屬性。故添加x屬性后,a指向的對象{n:1}變為{n:1, x:undefined/待賦值}, 由于b是和a指向的同一個對象,所以此時b={n:1, x:undefined/待賦值}
// 賦值操作(從右往左進行)。 a = {n:2}, a的指針由指向{n:1,x:{n:2} 變為指向對象 {n:2}
// 然后再進行賦值操作。a.x = {n:2} ,故x屬性的值為{n:2},由于b是和a指向的同一個對象,此時a=b={n:1,x:{n:2}
a.x = a = {n:2};
// 此時a={n:2}, 故a.x為undefined
console.log(a.x);
// b指針始終沒變,b={n:1,x:{n:2}}, 故b.x為{n:2}
console.log(b.x);