var a = {n:1}//1
var b = a//2
a.x = a = {n:2}//3
console.log(a.x)//undefined
console.log(b.x)//{n:2}
前提基础知识点:
- 引用类型赋值:
- 引用类型复制的时候,两个变量作为指针指向同一个对象
- 变量赋值的时候是将该变量指向另一个对象
- 通过点表示法,访问修改属性的时候,所指向的对象地址不变
- 操作符
- 点操作符号的优先级很高,仅次于(),方向是从左到右
- 赋值操作符的方向是从右到左。
操作符参考链接:MDN
现在来分析上面的代码,1、2两句将a、b这两个变量都指向{n:1}
(对象A)这二个对象,主要令人困惑的是第三句代码,由于.
操作符的优先级a.x
最先执行,即是给{n:1}
添加一个x属性,因此它变成{n:1,x:undefined}
(对象A),然后再执行a = {n:2}
,即是将a指向另一个对象{n:2}
(对象B),此时a和b已不是指向同一个对象了,最后执行a.x = a
,可以理解为将对象A的属性x指向了对象B。因此
a.x = undefined
b.x = {n:2}
画一个图一目了然: