题目
var a ={n:1};
var b = a;
a.x=a={n:2};
console.log(a);
console.log(b);
答案:
易错点(错误理解)
等号运算符如果从右往左,那么不是应该先a赋值到了新地址,然后a.x追加到a的新地址里吗?
纠正:不是把a.x追加进a的新地址,而是把a的新地址赋值给a.x,而a.x是存放在a原地址中的,因为a.x的.
操作符优先于=被执行
分析(正确理解)
- 首先对a开辟一块内存空间,然后存入{n:1},然后对b赋值a的地址,此时a和b指向同一块地址
.
运算符优先于 = 号运算符,此时先执行.
操作,即在a的地址内放入x属性(此处不同人有不同理解,我暂时理解为属性名不是变量,没有开辟新的空间)- 此时才进行赋值运算,赋值从右往左,一次赋值,即把{n:2}赋值给a及a.x,此时a指向新地址{n:2},而a.x也指向新地址{n:2}
- 也就是a.x被追加到了原地址a,即b,a指向新地址
画图辅助理解.
追加:
对新地址a内存的数据进行改变时,a.x也会发生对应改变
注:题目来源公开课面试题