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
4

2 に答える 2

2
//   v---- 1.  v---- 3.
a = [b][b = a, 0];
//      ^---^-- 2.
  1. 変数の値をb新しい配列に入れます。

  2. 次の角括弧のセットは、インデックスを取得するために使用されるメンバー演算子です。この場合、そのスペースは、変数の値をa変数に再割り当てするために使用されていbます。これは、の元の値が(手順1からbの)配列に安全に含まれているために実行できます。

  3. インデックスはコンマ演算子で区切られ、0取得される配列の実際の値として使用されます。これを思い出すと、元のb値になります。次に、これは回線aの最初の割り当てを介して割り当てられ=ます。

要約すると、bは配列に入れられ、0インデックスを介して取得さaれ、左側に割り当てられますが、前aに割り当てられることはありません(メンバー演算子b のスペースを借りる[]) 。


これは次のように書くこともできます:

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

現在の唯一の違いは、配列の2番目のインデックスが割り当てを行うために使用されることです。おそらくこのように少し明確です。

于 2013-03-26T05:20:11.790 に答える
0

Javascriptのコンマ演算子は、左側のオペランドを評価し、それを破棄して、評価後に右側のオペランドを返します。その唯一の用途は、左側のオペランドに副作用(変数の値の変更など)があるが、その結果が必要ない場合です。

[b]はbを含む配列を定義します。

[b = a、0]はb = aを評価するため、bにはaの値が含まれるようになります。それからそれは捨てます。次に、[b]のインデックス0にある要素を取得します-bを返します。aには、bの最新の値ではなく、そこに格納されているbの値が含まれているため、スワップは成功します(難読化されていますが)。

于 2013-03-26T05:18:48.397 に答える