若是你在網上搜索js連續賦值,那麼能夠看到幾乎都是如下這道題目javascript
var a = { n: 1 }; var b = a; a.x = a = { n: 2 }; console.log(a.x); console.log(b.x); // undefined // { n: 2}
結果是否是和你想的不同呢?這個解題思路在問答javascript 連等賦值問題,在這裏能夠看到不少,看完後我也認爲是運算符優先級的問題,如下就結合其餘人的想法和本身的思路作個總結。java
咱們分開分析segmentfault
var a = { n: 1 }; var b = a;
a和b都指向{n:1}(咱們且稱爲對象A,方便後面理解
)code
接着看下這段代碼中有幾個運算符?對象
a.x = a = { n: 2 };
有 賦值運算符 =
和 成員訪問運算符 .
兩個運算符
在上面的代碼中,咱們很容易忽視一個運算符:成員訪問運算符.
。它的優先級爲:19,僅僅比圓括號運算符()
的優先級:20低,而賦值運算符=
的優先級爲:3
因此運行過程是ip
1.先獲取對象A的屬性x等待後面運算結果賦值
2.a={n:2}
將變量a改成指向{n:2}(咱們且成爲對象B
)
3.給對象A的x屬性賦值,即指向對象B:{n:2}get
運行下來
b仍是指向對象A:{n:1,x:{n:2}}
a指向對象B:{n:2}
console
因此
a.x爲undefined
b.x爲{n:2}
變量