JavaScriptのチルダ演算子を使ってみる

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、奥が深いですね。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ