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

连续赋值

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

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

这块最难理解的就是这块java

a.x = a = {n: 2}

接下来咱们从如下几点分析如下:面试

  1. 运算符优先级;spa

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

连接: 运算符优先级指针

  1. 堆栈图来看怎么赋值操做的;code

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

clipboard.png

a.x = a = {n: 2} ;前面说了“.”的优先级大于赋值运算符的优先级,因此先来看a.x;a.x其实是未定义的;对象

clipboard.png

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

clipboard.png

以上若有出入,请多指正~~~内存

相关文章
相关标签/搜索