問題描述: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}
附變量關係圖: