var a = {n:1}
var b = a;
a.x = a = {n:2}
console.log(a.x)//undefined
console.log(b.x)//{n:2}
为什么会出现这样的结果呢?不是应该等号右边一路赋值过来的吗,应该是下面这样的逻辑才对啊...
var a = {n:1}
var b = a;
a = {n:2}
a.x = a;
console.log(a)//{n:2,x:{...}}
console.log(b)//{n:1}
这种结果就是按照正常思维的处理顺序,先把{n:2}给a,然后a.x再引用a,形成一个回环引用,但显然这样的逻辑是对不上结果的,那原因是什么呢?
第一步、先计算.运算符
由于一开始a和b变量指向的都是{n:1}这个对象,然后执行了这个对象的.运算符,其实此时当前这个{n:1}对象变成了
{
n:1,
x:undefined
}
第二步、a指向了新的地址{n:2}
第三步、确定a.x中的a到底是{n:1}还是{n:2}
答案是{n:1},因为一开始计算.运算符的时候,a就指的是{n:1},这里有一个解析的过程,所以a.x = {n:2}实际上就是给原本为undefined的x赋值了而已
{
n:1,
x:{
n:2
}
}
总结
连续赋值,遇到这种变量名字还都一样的情况需要注意的是这个a的指向,因为计算了.的缘故,a指向的还是原本的对象