你是否遇到过这样的面试题:
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x);
console.log(b.x);
复制代码
输出的结果:
a.x undefined;
b.x {n:2}
复制代码
b不是和a一样指向的一个对象吗?为什么赋值以后a.x为undefined;而b.x为{n:2}呢?
这里的关键是“.”是优先级最高的运算符; 我们把对象{n:1}称作对象X;a和b同时指向了对象X;以"."是优先级最高的运算符规则,第三行的运行顺序应为:
- a.x : 对象X声明了一个x的属性,并且值为undefined;
- 从左到右的顺序执行,a = {n:2} ,我们称{n:2}为对象Y;此时的a指向的对象就发生了变化,变成了新对象Y;
- a.x=a; 对象X的x属性指向了对象Y; 此时的指向关系是,a 指向新对象Y,b指向对象X;
当执行console.log(a.x)时,a指向的对象Y中不存在x属性,并且在其原型链上也找不到其属性,所以返回为undefined;
当执行console.log(b.x)时,b指向的对象X中的x属性为{n:2};所以输出为{n:2}
好吧,我自己都有点绕晕了。你有更精彩的解说,欢迎留言。