JavaScript连续赋值的问题

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指向的还是原本的对象

示意图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。