引用類型的賦值問題

問題描述:spa

1 var a = {n: 1};
2 var b = a;
3 a.x = a = {n: 2};
4 console.log(a.x);
5 console.log(b);
6 輸出什麼

 

錯誤分析:
直覺性的判斷a.x={n,2};b={n:2,x:object};指針

寫了JS示例,在火狐中經過F12調用控制檯面板獲得如下輸出:code

錯誤緣由有兩點:對象

理解了引用類型變量的複製狀況,沒有理解引用類型變量做爲指針實質,賦值時的使用。blog

操做符的優先級知識混亂。console

 

正確解題思路:class

首先了解,引用類型Object:變量

  • 在複製變量時,兩個變量做爲指針指向同一個對象;
  • 在變量賦值時,是從新指向另外一個對象;
  • 經過點表示法,訪問修改屬性值時,所指向的對象地址不變;

其次關於操做符的有限性:object

  • 賦值是從右往左,可是"."(字段訪問操做符)的優先於"="(賦值操做符);

在瞭解到這兩點後,開始分析題目的處理過程:引用

1 var a = {n: 1};     //將a指向對象{n:1}
2 var b = a;          //引用類型變量複製,b也指向對象{n:1}
3 a.x = a  = {n: 2};  //按照操做符優先級處理a.x,即添加a所指對象的屬性x,對象修改成{n:1,x:undefined}
4                     //再按照自右向左的順序賦值,先引用類型a從新指向新對象{n:2},
             //後從變量a向變量a.x賦值引用類型,指向同一個對象{n:2}
5 console.log(a.x); //a沒有x屬性,undefined 6 console.log(b); //b指向對象{n:1,x:Object}

附變量關係圖:

相關文章
相關標籤/搜索