Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

JavaScriptで仮変数も排他的論理和も使わず変数を入れ替える方法

http://www.ideaxidea.com/archives/2011/05/byte-saving_techs.html/trackback ここ参考です。わかりづらかったので、解説したいと思います。

var a=1,b=2,c;c=a;a=b;b=c // before
var a=1,b=2;a=[b,b=a][0]  // after

上のコードは仮変数を使っていれかえています。下のコードは配列を使って入れ替えています。

そう、配列を使っているのです。ここがポイントです。

では a=[b,b=a][0] で入れ替える仕組みを説明します。まずa=[b,b=a][0]は、[]の中から順に実行されます。つまり[b,b=a]がはじめに実行され、[0]があとから実行されます。[b,b=a]は前から順に実行されていきます。

まず[b,b=a]のbが評価され、この配列の中身は[2,b=a]になります。次に、b=aが評価されます。あまり関係がありませんが一応書いておきますと、b=aの部分は実はaが返されています。つまり配列の中身は[2,1]となります。

[b,b=a]が終わったので次の[0]に移っていきます。[0]は配列の要素を指しています。そのまんまですね。ここで言う配列とは[b,b=a]つまり[2,1]です。これのインデックス0をさしているので、2になります。

これで、a=[b,b=a][0]の右辺が2となり、a=2となり、入れ替えが完了します。

終わりに

これはあまり直感的でない上に仮変数を使う方法とくらべてメリットも少ないです。これじゃないとやだ!これが必要なんだよ!このビット数を抑えなきゃいけないんだ!というよっぽどのことがない限り仮変数を使って入れ替えたほうがいいと思います。

おまけ:仮変数での入れ替え方

tmp=a;
a=b;
b=tmp;

終わりです。tmpの名前はtでもmでもtmでもなんでもいいです。