问题来源
来自讨论群的代码:
var a = {n:1}
var b = a
a.x = a = {n:2}
console.log(a.x) //undefined
console.log(b.x) //{n:2}
输出为什么为undefined、{n:2}
问题分析
代码的前两行都是简单的对象引用,关键为第3行怎么理解?是不是与连等里顺序有关?
我们将第3行代码修改为a = a.x = {n:2}
发现输出结果一样。
这代表这与连等顺序没有关系。
1.第1,2行代码的作用是创建一个对象{n:1}设此对象A,并将变量a,b指向A。
2.第三行a.x在赋值前发现A对象没有x属性,则创建x,值为undefined,因为b与a指向同一个对象,所以有b.x = a.x
,此时A为{n:1, x: ''}
3.在进行赋值时,a与a.x、b.x(也就是A对象的x属性)会同时指向{n:2},设此对象为B。此时变量a与A.x指向了新对象B,变量b依然指向A。由于B没有x属性则为undefined。
见下列图示
逐行代码图示
0.变量提升
1.a赋值指向对象{n:1}
2.var b=a,a b 都指向{n:1}
3.连等
总结
我们在进行变量的属性赋值时实质是对变量指向的对象属性赋值。
.
优先级高于=