3
[-1,1][+!!boolean]

この行を見つけたJSコードをデバッグしていました。名前が示すように、varbooleanはtrueまたはfalseのいずれかの値を持つ可能性があります。

4

4 に答える 4

4

ええと、それは嫌です。何が起こっているのか:

!!boolean

booleanこれはtrue/falseブール値に変わります。これ!は否定であるため、2つ実行すると、否定の否定、つまり元のブール値が強制されます。基本的に、それはします:

var x = boolean;
if (x) {
    x = true;
} else {
    x = false;
}

+右側を数字に変えます。+true->1および+false-> 0

最初のビットは配列です。右側にあるものによって、その配列リテラルにインデックスを付けています。

つまり、booleantrueの場合、2番目の要素を取得し、そうでない場合は最初の要素を取得します。

[-1,1][+!!true] === 1
[-1,1][+!!false] === -1

これのはるかにひどいバージョン(三元を使用):

var x = boolean ? 1 : -1;

またはの乱用&&||

var x = (boolean && 1) || -1;
于 2013-03-18T07:00:30.797 に答える
3

最初のビットは、2つの値を持つ配列を作成します。

[-1,1]

2番目のビットは、二重反転を実行することにより、「ブール値」が実際にブール値であることを確認します。

!!boolean == boolean

プラス演算子は、このブール値を数値に変換するために使用されます。ここで、true => 1およびfalse => 0

最終的に、この数値は、その配列内の2つの値のいずれかを選択するために使用されます。つまり、この式は「true」を1に、「false」を-1に変換します。

ただし、これはもう少し読みやすいかもしれません。

boolean ? 1 : -1;
于 2013-03-18T07:01:57.813 に答える
1

式は、値と[-1,1]を含む配列です。-11

角かっこの2番目のセットは、配列から値をフェッチします。たとえば、xが配列の場合x[0]、最初の要素をフェッチします。と書くy = [-1,1][0]と、これは次のようになります。

var x = [-1,1];
y = x[0];

では、今はどう+!!booleanですか?!「偽」でない場合は、値をブール値に変換します。そして、それが真実である場合、そしてそれが偽である場合、!再度適用することはそれを変換します。(私は真実と偽の用語でこのグーグル検索をお勧めします)truefalse

最後に、+(正の)演算子はそれを数値に変換します。-(負の)演算子の反対と考えてください。したがって、に+true変換し1、に+false変換し-1ます。

あなたがそれの拡張された形を取り、それを関数として書くとしたら、これは(私の意見では)それでしょう:

function( value ){
    var  output_values  =  [ -1, 1 ]
      ,  boolean        =   !!value
      ,  index          =    +boolean
      ;        
    return output_values[ index ];
}
于 2013-03-18T07:08:53.813 に答える
0

変数に基づいて、最初の配列から1つの要素を選択しようとしています。

[-1,1][INDEX BASED ON BOOLEAN VALUE]

コードは次と同等です:

var myArr = [-1,1];
var selected = null;
if(boolean === false ){
     selected = myArr[0];
}
else {
     selected = myArr[1];

}

説明:

[+!!boolean]ブール値に基づいて0または1を返します。二重否定が行われ、false、空の配列、未定義、空のオブジェクトなどのすべての偽の値がブール値のfalseに変換され、真の値がブール値のtrueに変換されます。それらの前にaを置くと、+それらは整数に型キャストされるため、タージェント配列[-1,1]の有効なインデックスは0または1になります。

于 2013-03-18T07:01:55.977 に答える