2012-03-30 19 views
5

¿Puede alguien explicar el propósito de la anulación doble de la var reverse en el código siguiente?Significado de [-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];     
} 

La manera en que yo entiendo, el objetivo es escoger el índice adecuado de la matriz [-1,1] para luego usarlo en la multiplicación, pero me parece que [-1,1][+!!reverse]; podría sustituirse con seguridad por [-1,1][+reverse];

Am Estoy equivocado? ¿Qué gana o previene al negar por duplicado reverse allí?

vi el código anterior en this answer.

+0

Eso es asombroso, curioso de ver una respuesta en este –

+0

Cambia el valor de revertir a un booleano. [¡¿Qué es el !! (no no) operador en JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) – Mizuho

+1

Yo usaría '(reverse? 1: -1) 'en lugar de' [-1,1] [+ !! reverse] ', IMO es más claro, es más barato, no necesita un objeto de matriz y accede a un índice, e incluso la conversión booleana está implícitamente hecha por el operador condicional ... – CMS

Respuesta

5

La respuesta más sencilla es probablemente un contraejemplo:

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

desde el contenido de [] son ​​generalmente convierten en cadenas, [NaN] intentará acceder la propiedad llamada "NaN" de la matriz, que no existe y volverá indefinido:

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

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

+1

Gracias, siento que necesito correr y comprar un libro de Javascript lo antes posible: $ – Icarus

4

negación doble simplemente asegura que tenemos un bool adecuada ean. Como el reverso puede ser cualquier cosa, negarlo dos veces invoca las conversiones de "falsy" de JavaScript. Así, por ejemplo:

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

El !! convierte el valor a un valor booleano. Esto es necesario si reverse no es un booleano para comenzar.

Considerar: +!!"hi". Esto es 1, pero +"hi" es NaN.

1

la doble negación básicamente arroja el reverso como un booleano, y luego + convertirá ese booleano como un int.

así, si inverso es posiblemente: "sí", "no", "", verdadero, falso, 0,1,2, indefinido

la doble negación hará "sí" -> true "no" -> true "" -> false cierto -> true falsa -> false indefinido -> false

entonces, el + convertirá verdades a 1, y Falses a 0, por lo que se se puede usar como un índice de matriz.