2012-07-23 155 views
2

在javascript中使用鏈式速記運算符編寫交換函數時,我偶然發現了讓我困惑的東西。這些鏈式速記操作符爲什麼不起作用?

此代碼應該交換a和b值。

var a = 4532; 
var b = 969; 

a^=b^=a^=b; 

但事實並非如此:B = 4532,但= 0

如果我打破2行的代碼,它按預期工作。

var a = 4532; 
var b = 969; 

b^=a^=b; 
a^=b; 

什麼是技術解釋?

PS:這裏是the code on jsfiddle如果有人想快速嘗試自己。

回答

2

在回答你的問題之前,你能告訴下面的代碼的結果嗎?

var c = 1; 
c += c += 1; 

您可能會認爲,這是4,自己嘗試一下:)

我沒有任何的JavaScript代碼是如何引擎蓋下解釋的想法。以下是我試圖解釋爲什麼發生的原因。

通過a += b,它等於a = a + b。所以,c += c += 1c = c + (c = c + 1)。作業形式爲(c + (c = c + 1)),結果爲(c + c + 1)。在這裏,我認爲這是關鍵點,它令人困惑,變量c仍然是1,雖然我們重新分配了一個新值c + 1它在第一個作業c += 1

所以,a^=b^=a^=b等於a = a^b^a^b,那就是0。因爲a的內部更改被忽略,或者它可能是一個錯誤?

我的另一種猜測是,代碼可以這樣展開:

c = 1 + (c = 1 + 1)// in form of c = c + (c = c + 1) 

這就是我的猜測,因爲我不知道由VM生成的字節碼的樣子做。希望它是有用的。

相關問題