認識賦值運算符

請注意以下現象:spa

1 var foo = { n: 1 };
2 var bar = foo;
3 foo.x = foo = { n: 2 };
4 console.log(foo.x); // undefined

首先是兩個變量的聲明和初始化,var foo = { n: 1 }; var bar = foo;,這個很好理解,就是foo和bar同時指向了一個相同的對象{ n: 1 }code

接下來,對於表達式foo.x = foo = { n: 2 };,咱們都知道它實際上等因而foo.x = (foo = { n: 2 })。咱們開始應用上ECMA規範上的步驟,雖然賦值運算符具備右結合性,然而它首先作的是獲得表達式foo.x的值,根據咱們對Property Accessors的解釋它返回一個指向對象{ n: 1}的x成員的引用,須要注意的是,這個時候foo並無改變引用的指向。對象

繼續,開始計算右邊的結果,就是讓foo指向另外的一個對象{n: 2},返回值就是其右邊運算式(operand)的結果,即對象{n: 2}這個容易理解。blog

那麼如今應該清楚了,賦值語句中foo.x的結果是指向對象一成員x的引用,而下面的console.log(foo.x)中的foo指向的是對象二,因此這裏foo.x返回undefined就理所固然了。console

因此試着輸出對象一,即bar(由於它從始至終指向的是對象一):class

{ n: 1, x: { n: 2 } }
相關文章
相關標籤/搜索