2013-03-26 52 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的最新值,所以我们的交换是成功的(虽然被混淆了)。

相关问题