2016-06-11 116 views
4

賦值運算符具有從右到左的關聯性。所以賦值關聯性

var x,y; 
x=y=1; 

按預期工作和x等於1.現在考慮的代碼:

var foo={}; 
foo.x = foo = {n: 2}; 

我希望上述類似下面的工作:

var foo = {n: 2}; 
foo.x=foo; 

然而,在第一種情況foo.x爲undefined,而第二種情況爲foo.x points to foo(循環參考)。任何解釋?

回答

5

JavaScript從左向右評估表達式。我們可以證明這是怎麼回事,通過使用一個額外的變量:

var foo = {}; 
var bar = foo; // keep a reference to the object originally stored in foo 
foo.x = foo = {n: 2}; 

由於關聯的,最後一個語句被解析爲:

foo.x = (foo = {n: 2}); 

但由於評估順序,foo.x運行第一(確定在哪裏存儲該值),然後foo,然後{n: 2}。所以我們存儲{n: 2}在變量foo,則相同的值分配給的舊內容的foo ...我們可以通過查看bar查看屬性x

foo = {"n" : 2} 
bar = {"x" : {"n" : 2 }} 
+0

任何引用來支持聲稱轉讓表達式從左到右進行評估? – haim770

+0

@ haim770在http://www.ecma-international.org/ecma-262/6.0/中,我發現「* ECMAScript指定從左到右評估表達式*」。 – melpomene