ちょっとした豆知識

●変数入れ替え
変数の値を入れ替える方法というと普通

x = 3;
y = 5;
// change
t = x;
x = y;
y = t;

みたいに一時的に値を入れておく変数(t)を作って中身を入れ替えると思います

一時変数を使わない裏ワザっぽい方法として

x^=y^=x^=y;

というのがあります
^=は +=や*=みたいに左辺と右辺をイコールの前の演算子で計算して左辺に入れます
^演算はXORをします
XORはビットを見て違う場合に1、同じ場合に0になる演算です


0010(2)
XOR) 1011(11)
1001(9)

1001(9)
XOR) 1011(11)
0010(2)

というわけです
2回同じものでXORすると元に戻ります

x^=y^=x^=y;
xがx^yになります
(x^y)^=y^=(x^y);
yが xを2回yでXORしたものになるのでxになります
(x^y)^=x;
xが x^yなのでxのXORでyを2回xでXORしたものになってyになります

そんなわけで変数の中身が入れ替わります

実際この方法は一時変数使うより遅いです
さらに 見づらくて知らない人がみるとなにやってるのこれ ってなります
こんなことできるんだー くらいに思っておいて実際使わないほうがいいです
昔メモリが少なくて一時変数減らしたいときに使われてたのかな?

と、まぁこういう方法が存在するのですが、javascriptの豆知識としては、
これはjavascriptでは動かないってことです!
C言語などでは動きます

原因は
x^=y^=x^=y;
を計算するときに、最初に計算する青線引いてる右側の「x^=y」が実行されるとxの中身がx^yの結果になって左端の最後に計算する赤線のときはxがx^yのはずです
でも、javascriptでは右側計算しても左側を計算するときのxはこの式を計算する前のxのままなんです
なので左側x^=yのときにyがxになっているのでx^xを計算してxが0になってしまいます
y^=x^=y;
x^=y;
と2行に分けるとちゃんと動いてくれます

ついでにいうとこの方法、ちゃんと動くC言語の場合でも気をつけることが・・・
入れ替える必要性がある場合の例で、配列にデータがいっぱいあってランダムに並び替えたいとします
そのときに添字をランダムに2つとって、この方法で入れ替えると…
動きません
0がいっぱいになります
xとyが同じ変数の場合は0になります
普通、同じ変数の値を入れ替えるなんて無意味なことしませんが、今の例のようなことをして2つの添字が一緒の場合に例外処理をしてないとありえます
添字が両方5になってarray[5]とarray[5]を入れ替えってなるとarray[5]が0になります


●データのある方の変数のデータを代入する
こっちはjavascriptだと動く方

javascriptってブラウザごとに実装が違って複数のブラウザで同じ動作させようとするとある変数に値が入っていればそれ、undefinedとか値が入っていなければ別の値を ってことがあります
event処理とか

そんなときに楽に書ける方法が
a = b || c;
です
bにデータがあればbを、なければcをaに代入できます
if文で
if(b) a = b;
else a = c;
なんてしなくていい!

ブラウザごとの違いをなくすためにこういう処理することが多いからなのかこんな書き方ができます
他の言語では||が使えなかったりORだから論理演算になってtrueかfalseがaに入ったりするみたい
便利だねー javascript
ただ、こういう特殊なのになれると他の言語を使わないといけないことがあると困りそう


●switch文の型比較
javascriptなどの型がない言語だと
if(1=="1"){ }
みたいに==って書くと型を合わせてくれて、この場合TRUEになります
型も等しい場合にしたいときは
if(1==="1"){ }
みたいに===って書きます
数字 と 文字列 で型が違うので同じ1でもFALSEになります

==が便利なのでたいていifと==で使うのですがswitch文にすると===を使ったように型も同じ場合じゃないとダメになります
switch("1"){
case 1:
// 数字
break;
case "1":
// 文字列
break;
}
とすると文字列の方になります
引数をそのままswitch文に入れるときとかは値が文字列型で入っていてうまく動かない なんてこともあります