您的位置:首頁>正文

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。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示