javascript
JS 对象引用问题
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);
這兩個(gè)問題主要理解兩點(diǎn)就很簡單了。
對(duì)象是引用類型,改變賦值只是改變指針的引用。運(yùn)算符=相當(dāng)于改變指針的指向。
運(yùn)算符的優(yōu)先級(jí)。. > =。 即:在a.x = a = {n:2};中,先給對(duì)象a添加x屬性,再進(jìn)行a={n:2}與a.x={n:2}兩個(gè)賦值操作。
問題1:
// 變量a 指針指向?qū)ο?{n:1}
var a = {n:1};
// 變量b 指針指向?qū)ο?{n:1}
var b = a;
// 變量b指針不變,仍指向{n:1}; 變量a指針改為指向?qū)ο?{n:2}
a = {n:2};
// 注意運(yùn)算符的優(yōu)先級(jí)。先給對(duì)象a增加x屬性,再給x屬性賦值。此時(shí)x屬性的值指向a對(duì)象自身。即: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;
// 注意運(yùn)算符優(yōu)先級(jí)`.` > `=`
// 先給a添加x屬性。故添加x屬性后,a指向的對(duì)象{n:1}變?yōu)閧n:1, x:undefined/待賦值}, 由于b是和a指向的同一個(gè)對(duì)象,所以此時(shí)b={n:1, x:undefined/待賦值}
// 賦值操作(從右往左進(jìn)行)。 a = {n:2}, a的指針由指向{n:1,x:{n:2} 變?yōu)橹赶驅(qū)ο?{n:2}
// 然后再進(jìn)行賦值操作。a.x = {n:2} ,故x屬性的值為{n:2},由于b是和a指向的同一個(gè)對(duì)象,此時(shí)a=b={n:1,x:{n:2}
a.x = a = {n:2};
// 此時(shí)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);
轉(zhuǎn)載于:https://www.cnblogs.com/yzhihao/p/6409098.html
總結(jié)
- 上一篇: iOS------App之间传递数据的几
- 下一篇: java--xml文件读取(SAX)