JavaScriptのチルダ演算子を使ってみる
huluで特に見る予定のなかった映画を見てしまうminamiです。
JavaScriptにはいろいろな演算子があって便利に使えますが、~(チルダ)は今までほとんど使ってこなかったので使い道を探しました。
チルダは何をするもの?
JavaScriptのチルダ演算子はなにをするものでしょうか?調べてみます。
ビットごとの NOT: オペランドの各ビットを反転します。
なるほど。わからん。かいつまんで説明すると、数値を10進数や16進数ではなく32ビットの集合(0と1)として扱います。2進数ですね。整数をビット反転させると必ず符号を反転して1引いた数になります。
console.log(~-4); // 3
console.log(~-3); // 2
console.log(~-2); // 1
console.log(~-1); // 0
console.log(~0); // -1
console.log(~1); // -2
console.log(~2); // -3
console.log(~3); // -4
console.log(~4); // -5
-1かどうか判定する
~-1が必ず0になる、ということは、その数が-1かどうかを判定することができます。indexOfで文字列を検索した際、値が存在しない場合は-1を返すので下記のように書けます。
var arr = ['test','hoge','neko'];
var str = 'tako';
if(!~arr.indexOf(str)) {
console.log('ないです!'); //値がない場合
}
下記の書き換えですね。・・・役に立った!
var arr = ['test','hoge','neko'];
var str = 'tako';
if(arr.indexOf(str) === -1) {
console.log('ないです!'); //値がない場合
}
Math.floorの代わりに使う
チルダを2回使うと小数点以下を切り捨てることができます。なぜか。ECMA-262の仕様書72Pに書いてあります。
2. Let oldValue be ToInt32(GetValue(expr)).
新しい値が32ビットの整数型になる、ということで少数以下は切り捨てられます。Math.floor と同じような使い方ができます。
console.log(~~0.01); // 0
console.log(~~-1.22); // -1
console.log(~~-2.65); // -2
console.log(~~-3.45); // -3
console.log(~~145.20); // 145
console.log(~~2.333); // 2
ピンとくる人もいるかもしれませんが、ただ小数点以下が切り捨てられるので厳密にはMath.floorやMath.ceilと同等ではありません。(例えば、マイナスの値の切り捨ては値が小さくなる)切り捨て、切り上げを明確にしたい場合はやはりMath.floorやMath.ceilを使ったほうがよいでしょう。・・・役に・・・立つのか・・・?
まとめ
地味にもやっとした結果になりましたが、チルダを使ってみました。処理自体は早いらしいので試してみてはいかがでしょうか。JavaScript、奥が深いですね。