2012-02-14 24 views
138

Duplicar posible:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?¿Signo de exclamación doble?

así que estaba debuging algo de código y corrieron a través de este:

var foo.bar = 0; // this is actually passed from another function, adding it for context 

function(foo) 
    var someVar = !!foo.bar; 
    if(foo.bar){ 
     // ..stuff happens 
    } 
    else{ 
     // .. something else happens 
    } 
} 

Está bien mis preguntas es ¿cuál es el punto de ¿? Todo lo que está haciendo es hacer el 0 === false.

  1. ¿Hay alguna ventaja de utilizar que en comparación con boolean(foo.bar)?

  2. foo.bar se puede evaluar en un si como es porque 0 === false ya, entonces, ¿por qué pasar por la conversión? (Somevar no se reutiliza en cualquier otro lugar)

+2

Bueno, sé lo que quiero Solo quiero saber cuál es el beneficio que no se explica en su pregunta vinculada. – jpalladino84

+0

'0 == falso' no' 0 === falso' el triple igual previene el intento implícito de lanzar. – Andrew

Respuesta

229

Esto convierte un valor a un valor booleano y asegura un booleano tipo.

"foo"  = "foo" 
!"foo"  = false 
!!"foo" = true 

Si foo.bar se pasa a través, entonces no puede ser 0, pero algún otro valor Falsy. Consulte la siguiente tabla de verdad:

Tabla de verdad para Javascript

''  == '0'   // false 
0   == ''   // true 
0   == '0'   // true 
false  == 'false'  // false 
false  == '0'   // true 
false  == undefined  // false 
false  == null   // false 
null  == undefined  // true 
" \t\r\n" == 0    // true 

Fuente: Doug Crockford

Javascript también se pone muy raro cuando se trata de valores NaN. ¡Y este es el único caso en el que puedo pensar en la parte superior de mi cabeza! se comportaría de manera diferente a ===.

NaN === NaN  //false 
!!NaN === !!NaN //true 

// !!NaN is false 
+6

Eso en realidad no responde la pregunta. La pregunta es: "foo.bar se puede evaluar en un si como está porque 0 === false ya, entonces ¿por qué pasar por la conversión?" Su respuesta explica * que * asegura un tipo booleano, pero el OP ya lo sabía; la pregunta es, ¿cuál es el * punto * de garantizar un tipo booleano? – ruakh

+0

@ruakh La sentencia if está implícita y no va a usar === – Gazler

+0

Disculpe, ¿podría elaborar un poco su último comentario? Porque realmente no veo qué punto estaba tratando de hacer. : -/ – ruakh

4

Como se indicó anteriormente, obliga a un objeto con un tipo booleano. Se puede ver por sí mismo:

(function typecheck() { 
    var a = "a"; 
    var b = !a; 
    var c = !!a; 

    alert("var a = " + typeof(a) + "\n" + 
     "var b = " + typeof(b) + "\n" + 
     "var c = " + typeof(c)); 
})(); 

Si simplemente está haciendo comparaciones, la conversión sólo le ahorra una conversión de tipos más adelante.

FYI, los siguientes valores son obligadas a FALSO en JavaScript:

  • falsa
  • ""
  • nula
  • indefinido
+0

Por 'coaccionado a FALSO' te refieres si lo hago: algo así como 'var b = (nullthing)? 'triste': 'feliz' 'Puedo obtener confiablemente b =' feliz 'si nullthing es 0, nulo, indefinido en blanco o falso? Podría haber jurado que tuve problemas en los que se quejaba de que no estaba definido o era nulo en este tipo de situaciones. – PixMach

+0

Las reglas de comparación son un poco extrañas. [Aquí hay una buena explicación en profundidad] (http://www.sitepoint.com/javascript-truthy-falsy/). En el ejemplo que das, tienes razón de que obtendrás un error de referencia. –

10

Creo que la respuesta es que realmente no tiene mucho sentido.Podemos especular sobre cómo se produjo:

  • tal vez una versión anterior de la función utilizada someVar en múltiples lugares, o de una manera que realmente se beneficiaron de tener true o false, por lo que este hecho más sentido.
  • tal vez la persona que escribió la función está tan acostumbrada a usar !! para convertir a true/false que no se dio cuenta de que no era necesario aquí.
  • tal vez la persona que escribió la función siente que a cada cómputo (en este caso, conversión booleana) se le debe dar un nombre significativo asignando alguna variable a su resultado.
  • quizás, dado que la conversión booleana en JavaScript es sorprendentemente propensa a errores (en ese ejemplo new Boolean(false) es un valor verdadero), la persona que escribió la función siente que siempre debe hacerse explícitamente en lugar de implícitamente — aunque el efecto es el mismo — solo para llamar la atención como posible punto de error.
    • esto, por supuesto, presupone que la persona que escribió la función piensa en !! como una conversión booleana "explícita". Técnicamente no es — utiliza la misma conversión booleana implícita que if hace — pero si está acostumbrado a este modismo, entonces equivale a una conversión explícita.

pero en mi opinión subjetiva, ninguna de esas razones es una muy buena!

+0

Esto es especialmente relevante y me hace preferir esta respuesta; "(en eso, por ejemplo, nuevo Boolean (falso) es un valor de valor real)" –

Cuestiones relacionadas