[解決済み] JavaScriptの>>演算子とは何ですか、どのように使うのですか?
質問
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エンジンがあったとしても、私は驚かない。しかし、それは実装の詳細であり、あなたがそれを利用することはできないでしょう)。
関連
-
Vueのフィルタの説明
-
JavaScriptのStringに関する共通メソッド
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
vueディレクティブv-bindの使用と注意点
-
vueの補間表現とv-textディレクティブの違いについて
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?