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);
这两个问题主要理解两点就很简单了。
对象是引用类型,改变赋值只是改变指针的引用。运算符=相当于改变指针的指向。
运算符的优先级。. > =。 即:在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);