今天看到一個面試題,一直想把這個題目解析更加直觀化,就跟看小人書同樣,看圖就能明白其中的原理,因此用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}
接下來咱們從如下幾點分析如下:面試
運算符優先級;spa
`咱們知道運算符的優先級決定了表達式中運算執行的前後順序,優先級高的運算符最早被執行。` 賦值運算順序是從右往左的,不過因爲「.」是優先級最高的運算符,因此這行代碼先「計算」了a.x;
優先級 | 運算類型 | 關聯性 | 運算符 |
---|---|---|---|
19 | 成員訪問 | 從左到右 | … . … |
3 | 賦值 | 從右到左 | … = … |
連接: 運算符優先級指針
堆棧圖來看怎麼賦值操做的;code
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}ip
以上若有出入,請多指正~~~內存