JavaScript 连等问题

问题来源

来自讨论群的代码:

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.变量提升

变量提升.png

1.a赋值指向对象{n:1}

a指向对象.png

2.var b=a,a b 都指向{n:1}

ab同时指向对象.png

3.连等

连等指向新对象.png

总结

  1. 我们在进行变量的属性赋值时实质是对变量指向的对象属性赋值。

  2. .优先级高于=

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

推荐阅读更多精彩内容