2

javascript で連結された省略形演算子を使用してスワップ関数を作成しているときに、私は非常に困惑するものに出くわしました。

このコードは、a と b の値を交換することになっています。

var a = 4532;
var b = 969;

a^=b^=a^=b;

しかし、そうではありません: b = 4532 ですが、a = 0 です。

このコードを 2 行に分割すると、意図したとおりに機能します。

var a = 4532;
var b = 969;

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

技術的な説明は何ですか?

PS:誰かがすぐに自分で試してみたい場合は、jsfiddle のコードを次に示します。

4

1 に答える 1

2

質問に答える前に、次のコードの結果を教えていただけますか?

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

4 だと思うかもしれませんが、自分で試してみてください :)

内部で JavaScript コードがどのように解釈されるのか、私にはわかりません。ここでは、なぜそうなったのかを説明しようとしています。

によりa += b、 に等しいa = a + b。そうc += c += 1ですc = c + (c = c + 1)。の形式で代入すると(c + (c = c + 1))、結果は になり(c + c + 1)ます。ここが重要なポイントだと思いますが、紛らわしいのですが、最初の代入で新しい値を再代入しますが、変数cはまだです。1c + 1c += 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 によって生成されたバイトコードがどのように見えるかはわかりません。それが役に立つことを願っています。

于 2012-07-23T10:41:34.777 に答える