2013-03-26 32 views
4

我不知道如何學習演示2,因爲這對我很困難。這兩個變量如何交換使用一條線?

//demo1.js 
var a = 1; 
var b = 2; 
var c; 

c = b; 
b = a; 
a = c; 

log(a); // a = 2 
log(b); // b = 1 I can read this one. 


//demo 2.js 

var a = 1, b = 2; 
a = [b][b = a, 0]; // why? '0' is a varible? 
console.log(a,b) //output a = 2, b =1 
+0

雖然這很整齊,但請不要把它當做你實際應該做的事。這不是質量代碼。 – 2013-03-26 05:22:48

回答

2
// v---- 1. v---- 3. 
a = [b][b = a, 0]; 
//  ^---^-- 2. 
  1. b變量的值在一個新的數組。

  2. 下一組方括號是用於獲取索引的成員運算符。在這種情況下,該空間正用於將a變量的值重新分配給b變量。這可以這樣做,因爲b的原始值安全地位於Array (來自步驟1)

  3. 用逗號分開,然後0索引被用作被檢索數組的實際值,如果您記得的是原始b值。然後通過線上的第一個=分配將其分配給a

所以總結,b被放入陣列,並且經由0索引被檢索並分配給a在左邊,而不是之前a被分配給b(借用[]構件的空間運營商)


這也可以寫成這樣:現在

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

唯一的區別是,數組的第二個索引是用來幹什麼的分配。可能這樣更清楚一點。

+0

非常感謝您的回答,真棒。 – 2013-03-26 05:27:23

+0

不客氣。 – 2013-03-26 05:27:34

0

Javascript中的逗號運算符評估其左操作數,將其拋出並在評估後返回其右操作數。它的唯一用處是左操作數有副作用(如修改變量的值),但不希望其結果。

[b]定義了一個包含b的數組。

[b = a,0]評估b = a - 因此b現在包含a的值。然後它將它扔掉。然後它將[b]的索引0處的元素返回b。 a現在包含存儲在那裏的b的值,而不是b的最新值,所以我們的交換是成功的(雖然被混淆了)。