215
var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
           ? 'value'
           : 'innerHTML'

私は答えの中でそれを見ました、そして私はそれを前に見たことがありません。

どういう意味ですか?

4

5 に答える 5

294

~オペランドのすべてのビットを反転するビット演算子です。

たとえば、数値がの場合、 IEEE 754浮動小数点1のバイナリ表現(JavaScriptが数値を処理する方法)は次のようになります...

0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

したがって~、そのオペランドを32ビット整数に変換します(JavaScriptのビット演算子はそれを行います)...

0000 0000 0000 0000 0000 0000 0000 0001

負の数の場合は、2の補数に格納されます。つまり、すべてのビットを反転して1を加算します。

...そして、そのすべてのビットを反転します...

1111 1111 1111 1111 1111 1111 1111 1110

では、それの用途は何ですか?いつそれを使うことができるでしょうか?

それはかなりの数の用途があります。低レベルのものを書いているなら、それは便利です。アプリケーションのプロファイルを作成してボトルネックを見つけた場合は、ビット単位のトリックを使用することでパフォーマンスを向上させることができます(はるかに大きなバッグに含まれる可能性のあるツールの1つとして)。

また、見つかった戻り値を(偽物として見つからないようにしながら)真に変換することも(一般的に)不明確なトリックindexOf()であり、人々は数値を32ビットに切り捨てる(そしてそれを2倍にして小数点以下の桁数を落とす)という副作用のためによく使用します。正の数の場合と実質的に同じです)。Math.floor()

それが何のために使われているのかすぐにはわからないので、私は不明確と言います。一般に、コードを読んでいる他の人とコードを明確に伝達する必要があります。使用することはクールに見える~かもしれませんが、それは一般的にそれ自体の利益のためにはあまりにも賢いです。:)

また、JavaScriptにとが含まれるようになったため、関連性が低くArray.prototype.includes()なりString.prototype.includes()ました。これらはブール値を返します。ターゲットプラットフォームがそれをサポートしている場合は、文字列または配列に値が存在するかどうかをテストするためにこれを優先する必要があります。

于 2012-09-06T12:03:05.703 に答える
128

式の前に使用すると、indexOf()直接返される数値インデックスの代わりに、真偽の結果が効果的に得られます。

戻り値が-1、の場合、はすべて1ビットの文字列である~-1ため0です。-1ゼロ以上の値は、ゼロ以外の結果になります。したがって、

if (~someString.indexOf(something)) {
}

if「something」が「someString」にあるときにコードが実行されます。ブール値として直接使用しようとする.indexOf()と、ゼロが返されることがあるため(「何か」が文字列の先頭にある場合)、それは機能しません。

もちろん、これも機能します。

if (someString.indexOf(something) >= 0) {
}

そしてそれはかなり不思議ではありません。

時々あなたはこれも見るでしょう:

var i = ~~something;

この~ように演算子を2回使用すると、文字列を32ビット整数に変換する簡単な方法です。1つ目~は変換を行い、2つ目~はビットを元に戻します。もちろん、数値に変換できないものに演算子を適用するとNaN、結果として得られます。(編集—実際に~は、最初に適用されるのは2番目ですが、アイデアは得られます。)

于 2012-09-06T12:04:56.683 に答える
35

~is Bitwise NOT Operatorは、~xとほぼ同じ-(x+1)です。理解しやすい、ある種。それで:

~2;    // -(2+1) ==> -3

考えてみてください-(x+1)-1その操作を実行してを生成できます0

言い換えると、数値の範囲で使用すると、入力値に対してのみ偽の(から~強制的に)値が生成されます。それ以外の場合は、他の真の値が生成されます。false0-1

私たちが知っているように、-1一般的に番兵値と呼ばれます。これは、C言語で成功および失敗>= 0値を返す多くの関数に使用されます。JavaScriptでの戻り値の同じルール。-1indexOf()

この方法で、別の文字列の部分文字列の有無を確認するのが一般的です。

var a = "Hello Baby";

if (a.indexOf("Ba") >= 0) {
    // found it
}
if (a.indexOf("Ba") != -1) { 
    // found it
}

if (a.indexOf("aB") < 0) { 
    // not found
}
if (a.indexOf( "aB" ) == -1) { 
    // not found
}

~ただし、以下のように実行する方が簡単です。

var a = "Hello Baby";

~a.indexOf("Ba");         // -7   -> truthy
if (~a.indexOf("Ba")) {   // true
    // found it
}

~a.indexOf("aB");         // 0    -> falsy
!~a.indexOf("aB");        // true
if (!~a.indexOf( "aB" )) {  // true
    // not found
}

あなたはJSを知らない:カイルシンプソンによるタイプと文法

于 2016-01-11T05:17:44.597 に答える
27

~indexOf(item)かなり頻繁に出てきます、そしてここでの答えは素晴らしいです、しかし多分何人かの人々はそれを使う方法を知っていてそして理論を「スキップ」する必要があるだけです:

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }
于 2015-02-27T03:38:08.993 に答える
13

チルダトリックを使用して結果から真の値を作成することを検討している場合は、より明示的で、代わりにのメソッドをindexOf使用する方が魔法が少なくなります。includesString

'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false

これはES2015の新しい標準的な方法であるため、古いブラウザでは機能しないことに注意してください。それが重要な場合は、String.prototype.includespolyfillの使用を検討してください。

この機能は、同じ構文を使用するアレイでも使用できます。

['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false

古いブラウザのサポートが必要な場合は、Array.prototype.includespolyfillを次に示します。

于 2016-03-03T22:09:35.200 に答える