Para qué nos vale la comprobación con doble negación en JavaScript

miércoles, 14 de enero de 2015

Para qué nos vale la comprobación con doble negación en JavaScript


Como sabéis JavaScript y su esquema de "tipado débil" permite la ejecución de ciertas instrucciones que de entrada puede parecer un poco raras tales como a===b o !!value, son expresiones que ciertamente no estamos acostumbrados a ver en lenguajes tipo c# o vb... Básicamente se debe a que internamente JavaScript realiza las conversiones de tipos (próximamente escribiré sobre este tema).


El uso de la doble negación es más común de lo que nos puede parecer en primer momento, suele utilizarse en bastantes librerías profesionales y la verdad es que una vez que te acostumbras, resulta la manera más elegante en comprobar un valor. Antes de explicar cómo funciona realmente la doble negación o el uso de doble exclamación en JavaScript , tengamos en cuentan algunas aclaraciones:

  • Al evaluar expresiones en JavaScript, este convierte automáticamente la expresión en un valor booleano. Es decir: 'true' == true
  • Cuando usamos una negación (por ejemplo: !true ) realmente lo que estamos haciendo es convertir en booleano e invertir/negar el valor evaluado, es decir !true == false o esta expresión  !'true' == false. (ambas expresiones, devuelven true, ya que convierte a booleano y evalúa la expresión)  
  • Cuando evaluamos expresiones, no hace falta comparar contra un booleano. Es decir, no hace falta que hagamos esto if (success == true) simplemente podemos hacer esto: if (success)


Entonces, una doble negación en JavaScript es...

Una doble negación en JavaScript, realmente lo que hace es con el primer símbolo de exclamación, convierte a booleano y niega (o invierte) la expresión y con la segunda exclamación, lo vuelves a negar (invertir) y obtienes el valor original convertido a booleano.

Con este post quería dejar claro los posibles resultados al utilizar la doble negación en base a lo que se este evaluando, así que a continuación veréis una tabla de resultados en base a diferentes valores evaluados:

InstrucciónResultadoComentario
!!false
false
//false es falso
!!true
true
//true es verdadero
!!0
false
//0 es falso
!!1
true
//1 es verdadero
!!-1
true
//-1 es verdadero
!!2
true
//2 se toma como objeto y al no ser undefined, es verdadero
!!3
true
//3 se toma como objeto y al no ser undefined, es verdadero
!!parseInt("test")
false
//NaN es falso
!!(vacio)
false
//empty es falso
!!"no vacio"
true
//las cadenas no vacias al no ser undefined son verdaderas
!!"0"
true
//"0" al ser una cadena se toma como verdadero
!!undefined
false
//(undefined) es falso
!!null
false
//(null) es falso
!!{a:1,b:2}
true
//(object) es verdadero
!!{}
true
//todos los objetos son verdaderos
!![]
true
//un array tambien es un objeto, con lo que es verdadero

Podéis ver esto en ejecución en el siguiente ejemplo:

0 comentarios :

Publicar un comentario