華文網

JavaScript的連續賦值的思考

下面是一個連續賦值的例子:

在這裡面,先創建a對象並添加n:1,

然後將a對象賦值給b,這時候a和b引用同一個對象。最後我們要著重理解這最後一行代碼

a.x = a = {n:2};

按照我們平常的思維,應該是{n:2}賦值給 a,a的引用改變了,但b仍然是原來的引用,然後再賦值給a.x,這時候a是{n:2,x:{n:2}},也即是a.x={n:2}。但是,很顯然我們的執行結果不是這樣的,為什麼會這樣呢?

其實這是調皮的運算優先順序搞的鬼,a.x成員訪問的優先順序僅次於括弧,成員訪問.訪問的屬性如果不存在就會被創建並且該成員訪問運算式的值是undefined。

這裡的會先執行a.x,此時為a動態的創建了x屬性,屬性值預設為undefined,並且由於b引用和a同一個位址,所以也擁有b.x這個屬性。然後開始賦值運算a={n:2},此時a的指向地址更改,注意這時候a.x(b.x)仍然是原先位址的屬性,更改變引用位址的a已經沒有關係了。然後是a.x={n:2},所以b.x={n:2},並且由於a指向的是新位址,當執行a.x的時候,a.x=undefined。