web-dev-qa-db-ja.com

!!〜(チルダ/バンバンチルダではない)は、「含む/含まれる」配列メソッド呼び出しの結果をどのように変更しますか?

JQuery inArrayページ here でコメントを読むと、興味深い宣言があります。

!!~jQuery.inArray(Elm, arr) 

現在、二重感嘆符は、結果をbooleanの値でtrue型に変換すると考えています。私が理解していないのは、チルダ(~)このすべての演算子?

var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }

ifステートメントのリファクタリング:

if (!!~jQuery.inArray("one", arr)) { alert("Found"); }

壊す:

jQuery.inArray("one", arr)     // 0
~jQuery.inArray("one", arr)    // -1 (why?)
!~jQuery.inArray("one", arr)   // false
!!~jQuery.inArray("one", arr)  // true

また、チルダを前に置くと、結果は-2

~!!~jQuery.inArray("one", arr) // -2

ここでチルダの目的がわかりません。誰かがそれを説明してもらえますか、またはリソースの方に私を指し示すことができますか?

93
user717236

チルダ演算子は、実際にはjQueryの一部ではありません。JavaScript自体のビット単位のNOT演算子です。

ティルデの偉大な謎(〜)を参照してください。

整数でビットごとの論理演算を実行しているため、実験で奇妙な数字が得られます(私が知っている限り、これは2の補数またはそのようなものとして格納される可能性があります...)

2の補数は、バイナリで数値を表現する方法を説明します。私は正しかったと思います。

55
p.g.l.hall

~の前に$.inArrayが適用される場合がありますが、特定の理由があります。

基本的に、

~$.inArray("foo", bar)

短い方法です

$.inArray("foo", bar) !== -1

$.inArrayは、最初の引数が見つかった場合は配列内のアイテムのインデックスを返し、見つからない場合は-1を返します。これは、「この値は配列にありますか?」というブール値を探している場合、-1は真実の値であり、$。inArrayが0(偽の値)を返すため、ブール値の比較ができないことを意味します)、配列の最初の要素で実際に見つかったことを意味します。

~ビット単位演算子を適用すると、-10になり、0が `-1になります。したがって、配列内の値が見つからず、ビット単位のNOTを適用すると偽の値(0)になり、他のすべての値は0以外の数値を返し、真の結果を表します。

if (~$.inArray("foo", ["foo",2,3])) {
    // Will run
}

そして、意図したとおりに機能します。

117
Yahel

_!!~expr_は、falseが_-1_の場合はexprに評価され、それ以外の場合はtrueに評価されます。
_expr != -1_と同じですが、壊れているだけです*


JavaScriptビット演算 がオペランドを2の補数形式の32ビット符号付き整数に変換するため、機能します。したがって、_!!~-1_は次のように評価されます。

_   -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1
  ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits)
   !0 = true                                     // ! is logical not (true for falsy)
!true = false                                    // duh
_

_-1_以外の値には、少なくとも1ビットがゼロに設定されます。これを反転すると、真の値が作成されます。 _!_演算子を真実の値に2回適用すると、ブール値trueが返されます。

.indexOf()とともに使用し、結果が_-1_かどうかのみをチェックしたい場合:

_!!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false
!!~"abc".indexOf("a") // indexOf() returns  0, the expression evaluates to true
!!~"abc".indexOf("b") // indexOf() returns  1, the expression evaluates to true
_

* _!!~8589934591_はfalseと評価されるため、これは 憎悪 _-1_のテストに確実に使用することはできません。

102
Salman A

~foo.indexOf(bar)は、contains関数が存在しないため、foo.contains(bar)を表す一般的な略記法です。

JavaScriptの「偽の」値の概念により、通常、ブールへのキャストは不要です。この場合、関数の出力をtrueまたはfalseに強制するために使用されます。

32
zzzzBov

jQuery.inArray()は、 "not found"に対して_-1_を返します。その補数(_~_)は_0_です。したがって、~jQuery.inArray()は、 "not found"に対して偽の値(_0_)を返し、 "found"に対して真理値(負の整数)を返します。 _!!_は、偽の/真の値を真のブール値false/trueに形式化します。したがって、!!~jQuery.inArray()は、 "found"にtrueを、 "not found"にfalseを提供します。

18
Amadan

4バイトすべての_~_ intは、この式-(N+1)と同じです。

[〜#〜] so [〜#〜]

_~0   = -(0+1)   // -1
~35  = -(35+1)  // -36 
~-35 = -(-35+1) //34 
_
12
Mina Gabriel

_~_演算子はビット単位の補数演算子です。 inArray()からの整数結果は、要素が見つからない場合は-1、または負でない整数です。 -1のビット単位の補数(すべて1ビットとしてバイナリで表される)はゼロです。負でない整数のビットごとの補数は常にゼロではありません。

したがって、整数「i」が負でない整数の場合、_!!~i_はtrueになり、「i」が正確に-1の場合はfalseになります。

_~_は常にオペランドを整数に強制することに注意してください。つまり、非整数の浮動小数点値と整数、および非数値を強制します。

10
Pointy

Tildeはビット単位ではない-値の各ビットを反転します。一般的な経験則として、~数値の場合、その符号は反転され、その後1が減算されます。

したがって、~0、-1を取得します(0を反転すると-0、1を減算すると-1)。

それは本質的に、常にブール値である値を取得するための精巧で超最適化された方法です。

10
Joe

正しい:このコードは、false呼び出しが-1を返すときにindexOfを返します。それ以外の場合はtrue

あなたが言うように、次のようなものを使用する方がはるかに賢明です

return this.modifiedPaths.indexOf(path) !== -1;
8
LukeH

~演算子はビット単位のNOT演算子です。これが意味するのは、バイナリ形式の数値を取り、すべてのゼロを1に、1をゼロに変えるということです。

たとえば、バイナリの0は0000000、-1は11111111。同様に、1は00000001はバイナリで、-2は11111110

6
Frxstrem

私の推測では、数文字短いのでそこにあると思います(ライブラリの作成者は常に後です)。また、ネイティブコードにコンパイルされたときに(数との比較ではなく)数マシンサイクルしか必要としない操作も使用します。

私は別の答えに同意しますが、それはやり過ぎですが、おそらくタイトなループでは意味があるかもしれません(ただし、パフォーマンスゲインの推定が必要です。

3

これはビット単位の操作であるため、modifiedPathsにパスが表示されるかどうかを確認する最も高速な(計算的に安価な)方法だと思います。

2
panos2point0

(~(-1)) === 0、 そう:

!!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false
1
Engineer