[-1,1][+!!boolean]
この行を見つけたJSコードをデバッグしていました。名前が示すように、varbooleanはtrueまたはfalseのいずれかの値を持つ可能性があります。
[-1,1][+!!boolean]
この行を見つけたJSコードをデバッグしていました。名前が示すように、varbooleanはtrueまたはfalseのいずれかの値を持つ可能性があります。
ええと、それは嫌です。何が起こっているのか:
!!boolean
boolean
これはtrue/falseブール値に変わります。これ!
は否定であるため、2つ実行すると、否定の否定、つまり元のブール値が強制されます。基本的に、それはします:
var x = boolean;
if (x) {
x = true;
} else {
x = false;
}
は+
右側を数字に変えます。+true
->1
および+false
-> 0
。
最初のビットは配列です。右側にあるものによって、その配列リテラルにインデックスを付けています。
つまり、boolean
trueの場合、2番目の要素を取得し、そうでない場合は最初の要素を取得します。
[-1,1][+!!true] === 1
[-1,1][+!!false] === -1
これのはるかにひどいバージョン(三元を使用):
var x = boolean ? 1 : -1;
またはの乱用&&
と||
:
var x = (boolean && 1) || -1;
最初のビットは、2つの値を持つ配列を作成します。
[-1,1]
2番目のビットは、二重反転を実行することにより、「ブール値」が実際にブール値であることを確認します。
!!boolean == boolean
プラス演算子は、このブール値を数値に変換するために使用されます。ここで、true => 1
およびfalse => 0
。
最終的に、この数値は、その配列内の2つの値のいずれかを選択するために使用されます。つまり、この式は「true」を1に、「false」を-1に変換します。
ただし、これはもう少し読みやすいかもしれません。
boolean ? 1 : -1;
式は、値と[-1,1]
を含む配列です。-1
1
角かっこの2番目のセットは、配列から値をフェッチします。たとえば、x
が配列の場合x[0]
、最初の要素をフェッチします。と書くy = [-1,1][0]
と、これは次のようになります。
var x = [-1,1];
y = x[0];
では、今はどう+!!boolean
ですか?!
「偽」でない場合は、値をブール値に変換します。そして、それが真実である場合、そしてそれが偽である場合、!
再度適用することはそれを変換します。(私は真実と偽の用語でこのグーグル検索をお勧めします)true
false
最後に、+
(正の)演算子はそれを数値に変換します。-
(負の)演算子の反対と考えてください。したがって、に+true
変換し1
、に+false
変換し-1
ます。
あなたがそれの拡張された形を取り、それを関数として書くとしたら、これは(私の意見では)それでしょう:
function( value ){
var output_values = [ -1, 1 ]
, boolean = !!value
, index = +boolean
;
return output_values[ index ];
}
変数に基づいて、最初の配列から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になります。