看木易楊的文章的時候,遇到一道思考題,對a.x的值存在疑惑,因而分析總結。javascript
var a = {n: 1};
var b = a;
a.x = a = {n: 2}
a.x // 這時a.x的值是多少
b.x // 這時a.x的值是多少
複製代碼
上面的思考題運行結果是:java
undefined
{n:2}
複製代碼
看其餘人的分析說:代碼的執行順序,先從左到右掃描變量,再從右到左進行賦值。我想從內存空間管理的角度去分析。spa
var a = {n: 1};
var b = a;
複製代碼
前兩句很容易理解,a、b都存在內存棧中,存的是同一個堆內存地址,不論a、b誰改變都會二者都會同時更新。code
重點來了ip
a.x = a = {n: 2}
複製代碼
由於 「.」優先級高於"="
,因此a.x = {n: 2},至關於b.x = {n: 2},而後執行 a = { n: 2}
,至關於對a重新賦值,內存會給a重新分配一個堆內存地址。最後就是這種了:內存
a = {n: 2}
b = {
x: {n: 2},
n: 2
}
複製代碼
此時去訪問 a.x
,b.x
的時候。獲得的結果就能理解了。it
個人思考跟網上的有些看法不一致。class
有人認爲 先掃描變量 在進行賦值
:變量
a.x = null, a = {n: 1}
在 a.x = a = {n:2}
中,a = {n:2}
,讓 a
指向了 {n:2}
,即 a = {n:2}
。繼續賦值 a.x
,此時的 a.x
中,a
的指向沒有改變,能夠理解爲 a.x
中的 a
保留了原來的鏡像。我也不知道誰正確,你們都是朝着運行結果,用本身的知識去解釋的。咱也不太懂,咱也不敢問。有哪位大佬能夠給講解下,咖啡感謝。總結