2

私は SocketIO ソース コードを見ていますが、次のステートメントがあります。

if (-~manager.get('blacklist').indexOf(packet.name)) {

-~ここでの速記とはどういう意味ですか?

4

3 に答える 3

4

これは、次のトリックのようです。

if(manager.get('blacklist').indexOf(packet.name) !== -1)

他の人が述べたように~、2進数を反転するビット単位の否定です。たとえば、または 16 進数では になり00000001ます。111111100x010xFE

-1すべてのビット演算子が返すもの ( >>>unsigned int 32 を返すものを除く) である signed int 32 は、16 進数で として表され0xFFFFFFFFます。~(-1)ビットを反転して、結果は0x00000000which isになり0ます。

マイナスは単純に数字を否定します。zzzBov が述べたように、この場合は何もしません。

-~(-1) === 0

~(-1) === 0

コードは次のように変更できます。

if(~manager.get('blacklist').indexOf(packet.name))

しかし、私の意見では、文字はそれほど重要ではないので、おそらくもう少し読みやすい長いバージョンの方が良いか、contains メソッドを実装する方がさらに良いでしょう。このバージョンは JavaScript コンパイラに任せるのが最善です。またはコンプレッサーを使用して、この最適化を実行します。

于 2013-05-17T16:57:18.587 に答える
4

ビットごとの反転。

~0 == 0xFFFFFFFF == -1
~1 == 0xFFFFFFFE

マイナスは算術反転です。したがって、indexOf が失敗した場合、結果は 0 になります (-1 を返します)。

于 2013-05-17T16:54:49.333 に答える
3

2 つの演算子は省略形ではありません。~はビットごとの否定であり、-標準の否定です。

~foo.indexOf(bar)の一般的な省略形ですfoo.contains(bar)。結果はifステートメントで使用されるため、-直後の記号はまったく役に立たず、何の意味もありません。

-~1together は、数値に加算する手段です。数字の使用が許可されていないコード ゴルフで競技している場合を除き+ 1、一般的には役に立ちません。1

于 2013-05-17T16:58:26.683 に答える