2017-03-02 60 views
2

JavaScript允許的變量交換:解構分配和可變交換

var x = 1 
var y = 2 

[x, y] = [y, x] // y = 1 , x = 2 

與解構分配:

var a, b 
[a, b] = [1, 2] 

log(a) // 1 
log(b) // 2 

當使用替代與解構賦值的變量交換,試圖交換變量分解:

var a, b 
[a, b] = [1, 2] // a = 1, b = 2 

[a, b] = [b, a] // TypeError: Cannot set property '2' of undefined 

這是爲什麼?

+0

它工作在鉻(56.0.2924.87),你正在運行的瀏覽器? ,你使用的是轉譯器還是節點? –

+0

我沒有得到那個錯誤,但我要做的一件事就是在第一次賦值之後加上一個分號('[a,b] = [1,2];')。 – Pointy

+0

我正在使用節點7.4.0。 – Pointy

回答

6

如果您決定省略分號(沒有判斷,我更喜歡這樣),不要忘記以;前綴以數組字面開頭的行。有時候,分號插入確實是的問題,因爲它可能不會在您想要或期望的時候發生。

var a, b 
 
;[a, b] = [1, 2] 
 

 
;[a, b] = [b, a] 
 

 
console.log(a, b)

+0

謝謝@gyre。你介意解釋爲什麼在這種情況下需要分號嗎?或者給一個解釋它的資源指針? – jottr

+0

基本上,當你不使用分號時,JS引擎會看到這個:var a,b; [a,b] = [1,2] [a,b] = [b,a]'。一些數組文字被解釋爲屬性訪問,並且用於分隔元素的逗號被解釋爲[逗號運算符](https://developer.mozilla.org/ka/docs/Web/JavaScript/Reference/Operators/Comma_Operator )代替。 – gyre

+1

欲瞭解更多信息,我會建議閱讀[凱爾辛普森的書中的這一部分*你不知道JS *](https://github.com/getify/You-Dont-Know-JS/blob/master/類型%20&%20grammar/ch5.md#自動分號)。 – gyre