题目:
var a = {n:1};
var b=a;
a.x = a = {n:2};
console.log(a.x);
console.log(a);
console.log(b);
console.log(b.x);
这里不卖关子,直接看结果:
undefined
{ n: 2 }
{ n: 1, x: { n: 2 } }
{ n: 2 }
流程分析:
第一步:
声明了变量a,指向对象{n:1},这里取名为o
第二步:
声明变量b,将a的地址赋值给b,此时a和b指向同一块内存区域o
第三步:
由于js的运算优先级,a.x优先执行,我们在o上面定义x属性
第四步:
赋值操作的执行顺序从右往左,将{n:2}赋值给变量a,此时a的地址指向{n:2} 命名为o1,同时将{n:2}赋值给o.x。
至此:
console.log(a.x);
a指向了内存区域o1,o1上没有x属性,因此输出undefined
console.log(a);
a指向o1,输出{n:2}
console.log(b);
b指向o,输出{n:1,x:{n:2}}
console.log(b.x);
b指向o,o = {n:1,x:{n:2}},输出{ n: 2 }
以上纯属个人理解,如有错误的地方,恳请指正。
附:
优先级运算表: