一道思考題

看木易楊的文章的時候,遇到一道思考題,對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.xb.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 保留了原來的鏡像。

我也不知道誰正確,你們都是朝着運行結果,用本身的知識去解釋的。咱也不太懂,咱也不敢問。有哪位大佬能夠給講解下,咖啡感謝。總結

相關文章
相關標籤/搜索