以下輸出什麼
題目一:
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x)
console.log(b.x)
執行:
1.先執行 a.x
2.a = {n:2} ;//從右向左賦值
3.a.x ={n:2}; //賦值操作
解答思路:
1、優先級。.的優先級高於=,所以先執行a.x,堆內存中的{n: 1}就會變成{n: 1, x: undefined},改變之後相應的b.x也變化了,因爲指向的是同一個對象。
2、賦值操作是從右到左,所以先執行a = {n: 2},a的引用就被改變了,然後這個返回值又賦值給了a.x,需要注意的是這時候a.x是第一步中的{n: 1, x: undefined}那個對象,其實就是b.x,相當於b.x = {n: 2}
題目二:
var a = { x: 1 };
var b = a;
a = a.x = { x: 1 };
console.log(a); //{x:1}
console.log(b);//{x:{x:1}}
解題的兩個關鍵點:
1.操作符的運算優先級問題;.的優先級高於賦值語句;
var a = { x: 1 };
var b = a;
a.x = { x: 1 };
a = a.x;
當執行a.x = {x:1}
a = a.x;