3

En algunos códigos he visto una doble negación !! delante de una variable, por ejemplo:

{ token: !!localStorage.getItem('token') }

Entiendo que se usa una negación ! para realizar una negación lógica en una expresión.

Pero una doble negación lo convierte otra vez al estado como lo ha recibido al principio, por ejemplo:

var token = true;

console.log( token ); // true
console.log( !token ); // false
console.log( !!token ); // true

¿Para qué y porqué se usa esta técnica en JavaScript?

tchrist
  • 503
  • 6
  • 19
Black Sheep
  • 13,096
  • 6
  • 36
  • 60

1 Answers1

21

El primero ! convertirá un valor que no sea ni verdadero (true) ni falso (false) en un valor que sea verdadero (true) o falso (false), y luego lo invertirá.

Seguro que ahora estarás más confuso, pero veamos unos ejemplos:

var token_null = null;
console.log( 'token_null   =', token_null );   // null
console.log( '!token_null  =', !token_null );   // true
console.log( '!!token_null =', !!token_null );  // false

console.log( '-----------' );

var token_undefined = undefined;
console.log( 'token_undefined   =', token_undefined );   // undefined
console.log( '!token_undefined  =', !token_undefined );  // true
console.log( '!!token_undefined =', !!token_undefined ); // false

console.log( '-----------' );

var token_string = 'mi_token';
console.log( 'token_string   =', token_string );   // "mi_token"
console.log( '!token_string  =', !token_string );  // false
console.log( '!!token_string =', !!token_string ); // true

Quizás ahora se entienda el primer párrafo mejor con los ejemplos:

  • Convierte el valor a un valor que sea verdadero o falso

¿Para que y porque se usa esta técnica en JavaScript?

Mayormente se usa la doble negación !! para forzar la conversión del tipo, es similar si queremos comparar con el operador igualdad == también el tipo del valor, se tendría que usar el operador estrictamente iguales === .

Un ejemplo que se puede ver también en códigos reales:

var token = 'mi_token';
console.log( token == true );   // false
console.log( !token == true );  // false
console.log( !!token == true ); // true

En el ejemplo estamos comparando el valor con true (booleano), si no usaríamos la doble negación !! nos devolvería siempre un falso.

Otros usos sería también para ofuscar el código, ejemplo:

// Ofuscado
val.enabled = !!userId;

// Parcialmente ofuscado/legible
val.enabled = (userId != 0) ? true : false;

// El más legible
val.enabled = (userId != 0);

También dicen que es más rápido si usamos la doble negación pero juzgan ustedes mismo, he creado un Benchmark en jsPerf - Ver SpeedTest...

Fuentes y donde se puede ver más ejemplos y explicaciones:

Black Sheep
  • 13,096
  • 6
  • 36
  • 60