2012-03-30 17 views
5

Qualcuno può spiegare lo scopo del doppio negare la reverse var nel seguente codice?Significato [-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];     
} 

Il modo in cui ho capito, lo scopo è quello di scegliere l'indice corretto dalla matrice [-1,1] poi usarlo nella moltiplicazione per, ma mi sembra che [-1,1][+!!reverse]; potrebbe essere tranquillamente sostituita da [-1,1][+reverse];

Am Ho sbagliato? Cosa guadagni o prevedi raddoppiando lo reverse lì?

ho visto il codice di cui sopra sul this answer.

+0

Questo è impressionante, curioso di vedere una risposta su questo –

+0

Si modifica il valore di inverso per un valore booleano. [Qual è il !! (Non meno) operatore in JavaScript] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) – Mizuho

+1

vorrei usare '(reverse 1:?? -1) 'invece di' [-1,1] [+ !! reverse] ', IMO è solo più chiaro, è più economico, non ha bisogno di un oggetto array e accede a un indice, e anche la conversione booleana viene fatta implicitamente da l'operatore condizionale ... – CMS

risposta

5

La risposta più semplice è probabilmente un contro-esempio:

+undefined //NaN 
+!!undefined // 0 

dal contenuto di [] sono generalmente convertiti in stringhe, [NaN] tenterà di accedere la proprietà chiamata "NaN" dalla matrice, che non esiste e tornerà indefinito:

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

'[1, -1] [" 0 "]' è '1'. :-P –

+1

Grazie, sento che ho bisogno di correre e comprare un libro Javascript al più presto: $ – Icarus

4

doppia negazione assicura semplicemente che abbiamo un bool corretta ean. Poiché il contrario potrebbe essere qualsiasi cosa, la doppia negazione invoca le conversioni "false" di JavaScript. Così, per esempio:

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

Il !! converte il valore a un valore booleano. Questo è necessario se reverse non è un booleano con cui iniziare.

considerare: +!!"hi". Questo è 1, ma +"hi" è NaN.

1

la doppia negazione getta sostanzialmente invertire come un valore booleano, e poi + getterà che booleano come un int.

così, se contrario è probabilmente: "sì", "no", "", vero, falso, 0,1,2, non definito

la doppia negazione farà "sì" -> true "no" -> true "" -> false vero -> true false -> false indefinito -> false

allora, il + convertirà Trues a 1, e falses a 0, in modo che può essere usato come indice di array.