JavaScript における Double Tilters (~~) の正体を明らかにする
JavaScript の領域では、 演算子が際立っています謎の機能を備えています。単一のチルダ (~) がビット単位の NOT を意味することはよく知られており、そのダブレット () は何を実現するのでしょうか?
ビット単位の否定を 2 倍にするという直観に反して、~~ 演算子は考えさせられます。驚くべき効果があります。これには、数値の小数部分を切り捨て、効果的に最も近い整数に向かって四捨五入する機能があります。
舞台裏では、~~ 演算子はオペランドを符号付き 32 ビット整数として扱うことによって動作し、次の処理を実行します。オペランドの実際の型 (数値、文字列など) に関係なく、ビット単位の演算を実行できます。その結果、小数部は破棄され、結果は常に数値になります。
正確には、~~ 演算子は基本的に次の関数をシミュレートします:
function truncate(x) { if(x < 0) return Math.ceil(x); else return Math.floor(x); }
ただし、この演算は次のとおりです。 x の値が -(2^31) ~ 2^31 - 1 の範囲内にある場合にのみ true。この範囲外では、オーバーフローが発生し、予期しない結果が生じる可能性があります。
~~ は文字列引数を数値に迅速に変換するのに便利ですが、その制限 (オーバーフローの可能性や非整数値に対する誤った動作) が発生します。数値操作にはあまり望ましくありません。代わりに、一般に、これらの目的には x または Number(x) を使用することをお勧めします。
二重否定の解読
否定の否定には ~~ 演算子が必要であることを理解するバイナリ表現についてさらに深く掘り下げます。符号付き (2 の補数) 32 ビット バイナリ形式で表される数値 -43.2 を例に挙げます。
-43.2<sub>10</sub> = 11111111111111111111111111010101<sub>2</sub>
すべてのビットを反転すると (ビット単位の NOT)、次のようになります。
NOT -43<sub>10</sub> = 00000000000000000000000000101010<sub>2</sub> = 42<sub>10</sub>
もう一度否定を適用すると、次の結果が得られます。
NOT 42<sub>10</sub> = 11111111111111111111111111010101<sub>2</sub> = -43<sub>10</sub>
この最終結果 (-43) は、Math.floor(-43.2) の結果 (-44) とは異なります。これは、切り捨てを行う Math.floor とは異なり、~~ は数値をゼロから遠ざけるためです。
以上が## 二重チルダ演算子 (~~) は JavaScript で実際に何をするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。