Operador de negación «!»

Si no estás muy familiarizado con este operador, sólo voy a decirte que se utiliza para invertir valores booleanos ¿Cómo sería esto?

Si tuviésemos dos variables con valores true o false:

let v1 = true;
let v2 = false;

console.log(v1);
console.log(v2);

Hasta acá nada nuevo, algo que se aprende en salita de jardín en programación. Pero podemos hacer algo como esto:

let v1 = !true;
let v2 = !false;

console.log(v1);
console.log(v2);

En realidad lo que estamos haciendo es invertir el valor boolean; es decir, lo que vale true, se invierte a false, y lo que vale false, a true.

Patrón toggle

«toggle», que se podría traducir como palanquear o alterar, tiene como un efecto de interruptor o botón. Si un velador está apagado al pulsar en el botón se enciende, pero si está encendido, se apaga:

let boton_encendido = false;

const cambiarEstadoBoton = () => {
    //toggle.
    boton_encendido = !boton_encendido;
    console.log(`El valor del botón es: ${boton_encendido}`);
}

//Al hacer click en la página cambia el estado del botón de true a false y viceversa.
document.addEventListener("click", cambiarEstadoBoton);

Como podemos ver en este último caso tenemos una variable:

let boton_encendido = false;

Y cada vez que se llama a la función cambiarEstadoBoton() se invierte el valor de la misma. Es decir que podemos evitar hacer algo como esto:

if(boton_encendido == true){
    boton_encendido = false;
}else{
    boton_encendido = true;
}

Reemplazándolo por:

boton_encendido = !boton_encendido;

Al igualar la variable por su valor actual, pero con con el signo «!» por delante invertimos su valor.

Condicionales

Cuando escribimos el código para un condicional, mucha/os desarrolladora/es suelen hacer algo cómo:

if( vx == true ){
    //Entra si vx es true.
}

O hacer lo propio para verificar si «vx» es false:

if( vx == false ){
    //Entra si vx es false.
}

Esto último si bien no está mal, es un poco redundante. Por ejemplo en el primer caso, en el que verificamos si la variable/constante es true, directamente podemos escribir:

if( vx ){
    //Entra si vx es true.
}

Esto se debe a que la condición ya de por sí verifica que lo que ingresamos entre los paréntesis devuelva un valor true.

Si no me creés podés probar algo como esto:

let n1 = 1;
let n2 = 1;

//Si n1 es igual a n2 va a guardar true, sino false.
let iguales = (n1 === n2);

console.log(iguales);

Por tanto, si nosotros queremos probar si una variable/constante es true, podemos incluir la variable sin necesidad del (== true)

En cambio si queremos verificar si una variable/constante es false, y teniendo en cuenta el uso del operador de negación «!», podés hacer lo siguiente:

if( !vx ){
    //Entra si vx es false.
}

Otros usos

También se verifica si una variable string está vacía de la siguiente forma:

let variable_string = "";

if(!variable_string){
    console.log("La variable está vacía");
}

Si una variable numérica es 0 (cero):

let variable_numerica = 0;

if(!variable_numerica){
    console.log("La variable es cero");
}

Incluso comprobar si una variable es nula:

let variable_null = null;

if(!variable_null){
    console.log("La variable es nula");
}