網上看到「葉小釵」的一篇面試文章,裏面談到了一個js的面試題,本身作着試了下,全錯!因而根據結果,反推了下緣由。html
題目:java
var a = {n: 1};var b = a; a.x = a = {n: 2} console.log(a.x); console.log(b.x)
這裏面至少考了2個點:面試
一、js的引用類型數據;spa
二、運算符優先級;code
對於一個老手來講,這裏的坑主要在第二條,運算符優先級。htm
a.x = a = {n: 2}
2個等號,優先級相同,就先來後到,從左到右,等效於blog
a.x={n:2}; a={n:2};
爲何不能等效於:get
a.x=a; a={n:2};
我的這麼分析:console
js在執行賦值語句時,class
若是等號右邊是單個變量或者常量,直接執行賦值語句
若是是表達式,就看運算符優先級,若是優先級高於賦值語句,好比加法、減法等,就等高優先級運算以後,將結果賦值
若是又是一個賦值語句,那麼優先級並不比本身高,就不能讓它先計算,而是本身先往右繼續尋找,直到找到一個獨立的常量或者變量。
在這個例子中
a.x = a = {n: 2}
js引擎,不會把a直接賦值給a.x,由於a不是獨立的,它從屬於另一個賦值語句,且是它的主體
a = {n: 2}
這個賦值語句,計算優先級和本身相同,先來後到,那麼這個賦值語句就不能執行,本身仍是繼續往右找:a不能賦值,=是運算符,更不可能,繼續往右,就是
{n: 2}
它是一個正真獨立的常量,因此第一個等號就賦值成它,也就是
a.x={n:2};
的出處,執行完第一個賦值語句,再執行第二個
a = {n: 2}
第二個比較直接就沒什麼好說的了
因此,源代碼中
a.x = a = {n: 2}
改爲
a.x = (a = {n: 2})
運算結果也仍是不變