連續賦值(從堆棧角度解析) 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

以上若有出入,請多指正~~~內存

相關文章
相關標籤/搜索