2012-03-30 3 views
5

誰かがreverse varを二重否定する目的を以下のコードで説明できますか?意味[-1,1] [+ !! boolean_var]

return function (a,b) { 
    var A = key(a), B = key(b); 
    return ((A < B) ? -1 : 
      (A > B) ? +1 : 0)) * [-1,1][+!!reverse];     
} 

私はそれを理解する方法は、目的は、乗算でそれを使用する[-1,1]配列から適切なインデックスを選択することですが、[-1,1][+!!reverse];が安全[-1,1][+reverse];

アム置き換えることができるように私には思えます間違ってる? reverseをダブルネゲートすることで、何を得るか、防ぐのですか?

私は最も簡単な答えはおそらく反例であるthis answer.

+0

これは素晴らしいです。 –

+0

これは逆の値をブール値に変更します。 [何ですか。 (not?)JavaScriptの演算子ですか?](http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) – Mizuho

+1

私は '(reverse?1:-1 ) 'ではなく[[-1,1] [+ !! reverse]'の代わりにIMOはもっと安く、配列オブジェクトとインデックスにアクセスする必要はなく、ブール変換も暗黙のうちに行われます。条件付き演算子... – CMS

答えて

5

に上記のコードを見て:

​​

[]一般的に文字列に変換されている内容から、[NaNの]にアクセスしようとします配列から「NaN」という名前のプロパティが存在し、未定義のまま返されます。

[1,-1][+undefined] 
[1,-1][NaN] 
[1,-1]["NaN"] 
undefined 
+0

'[1、-1] [" 0 "]'は '1'です。 :-P –

+1

ありがとう、私は実行し、できるだけ早くJavascriptの本を購入する必要があると感じる:$ – Icarus

4

Double Negatingは、適切なブールean。逆は何でもかまいませんので、二重否定するとJavaScriptの「偽の」変換が呼び出されます。したがって、たとえば:

!!"hello" // true 
!!"" // false 
!!1 // true 
!!some_undefined_var // false 
2

!!は値をブール値に変換します。これは、reverseが最初にブール値でない場合に必要です。

考慮:+!!"hi"。これは1ですが、+"hi"NaNです。

1

二重否定は、基本的に逆をブール値としてキャストし、そのブール値をintとしてキャストします。そう

、逆はおそらくある場合: "はい"、 "いいえ"、 "" はい "真、偽、0,1,2、未定義

二重否定は を行います" - >真 "なし" - >真 "" - >偽 真 - >偽 真 - >偽 未定義 - >偽

をそれはように、その後、+は、1にtruesを変換し、そして0にfalsesます配列インデックスとして使用できます。