连续赋值(从堆栈角度解析) a.x = a = {n:2}

时间: 2019-02-28阅读: 1207标签: 堆栈

连续赋值

今天看到一个面试题,一直想把这个题目解析更加直观化,就跟看小人书一样,看图就能明白其中的原理,所以用PPT做了几张图。

var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)

这块最难理解的就是这块

a.x = a = {n: 2}

接下来我们从以下几点分析以下:

运算符优先级;

`我们知道运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。` 赋值运算顺序是从右往左的,不过由于“.”是优先级最高的运算符,所以这行代码先“计算”了a.x;  
优先级运算类型关联性运算符
19成员访问从左到右… . …
3赋值从右到左… = …

链接: 运算符优先级

堆栈图来看怎么赋值操作的;

var a={n:1}; 
//a指向了堆内存中的对象{n:1},  var b=a; a赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”) ,而不是堆内存中的对象。

a.x = a = {n: 2} ;前面说了“.”的优先级大于赋值运算符的优先级,所以先来看a.x;a.x实际上是未定义的;

再来看赋值运算符的从右向左解析;a = {n : 2},a被从新赋值,指向了一个新对象,而此时a.x已经先行执行完,其实指是{ n:1,x: undefined } 这个对象,接下来看左边的等号,这个对象的x值 = 等号右边计算的结果(a={n:2},所以此时b的值通过箭头可以看出等于{n:1,x:{n:2}},a的值指向新对象{n:2}

以上如有出入,请多指正~~~


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/2633

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广