1. ホーム
  2. javascript

[解決済み] JavaScriptの>>演算子とは何ですか、どのように使うのですか?

2022-04-25 09:33:31

質問

MozillaのArrayにfilterメソッドを追加するコードを見ていたら、私を混乱させるコードの行がありました。

var len = this.length >>> 0;

JavaScriptで>>>が使われているのを初めて見ました。

これは何ですか、そして何をするものですか?

どのように解決するのですか?

非数値をNumberに変換するだけでなく、32ビット符号なしintで表現できるNumbersに変換しています。

JavaScript の Numbers は倍精度の浮動小数点数(*)ですが、ビット演算子( << , >> , & , |~ ) は、32ビット整数に対する演算として定義されています。ビット演算を行うと、数値は32ビット符号付き整数に変換され、端数や32ビットより上位のビットは失われてから演算が行われ、再び数値に変換されます。

つまり、0ビットの右シフトのような、実際には何の効果もないビット演算を行うことは >>0 これは、数値を丸め、32ビットintの範囲に収まるようにする簡単な方法です。さらに、トリプル >>> 演算子は符号なし演算を行った後、他の演算子のように符号付き整数ではなく、符号なし整数としてNumberに変換するため、負の値を大きなNumberとして32ビット2の補数型に変換するのに使用できます。使用方法 >>>0 は、0から0xFFFFFFFの間の整数を得ることを保証します。

この場合、ECMAScript は Array のインデックスを 32 bit unsigned int で定義しているため、これは便利です。したがって、もしあなたが array.filter を、ECMAScript 第 5 版の標準に書かれていることと正確に重複する方法で、次のように 32 ビット符号なし int にキャストします。

(実際のところ、実用上の必要性はほとんどありません。 array.length から 0.5 , -1 , 1e21 または 'LEMONS' . でも、これはJavaScriptの作者の話なので、わからないですよね...)

まとめ

1>>>0            === 1
-1>>>0           === 0xFFFFFFFF          -1>>0    === -1
1.7>>>0          === 1
0x100000002>>>0  === 2
1e21>>>0         === 0xDEA00000          1e21>>0  === -0x21600000
Infinity>>>0     === 0
NaN>>>0          === 0
null>>>0         === 0
'1'>>>0          === 1
'x'>>>0          === 0
Object>>>0       === 0

(*: まあ、floatと同じような挙動をすると定義されています。パフォーマンス上の理由から、実際にintを使うJavaScriptエンジンがあったとしても、私は驚かない。しかし、それは実装の詳細であり、あなたがそれを利用することはできないでしょう)。