Operadores lógicos

Los operadores lógicos se utilizan para evaluar varios términos como una expresión. También se utilizan para cambiar el valor de verdad de un término * o expresión.
Un operador lógico utiliza dos términos. Cada término devuelve un valor de verdad (boolean) y, al evaluarse en conjunto, se obtiene un valor de verdad para la expresión.
La negación (!) trabaja sobre un término o expresión. Cambia el valor de verdad que se tenga.

* Se puede utiilzar cualquier tipo de dato. JavaScript dependiendo del valor y del tipo de dato le va a asignar un valor de verdad. Más adelante viene una tabla de referencia.

Al igual que con los números (álgebra), se pueden utilizar paréntesis para agrupar diferentes operadores lógicos.

Conjunción – &&
Para que la expresión se considere verdadera ambos términos tienen que ser verdaderos.

// Sintaxis
a && b

// Ejemplo
var hora_actual = 20

if (hora_actual > 18 && hora_actual < 22) {
	console.log('estamos en clase...')
 }

Disjunción – ||
Para que la expresión se considere verdadera, al menos un término tiene que ser verdadero.
Si ambos términos son verdaderos también es verdadero.

// Sintaxis
a || b

var dia = 'viernes'
if (dia == 'martes' || dia == 'viernes') {
	console.log(en clase...')
}

Negación – !
Cambia el valor de verdad de un término o de una expresión.
Para que cambie el valor de verdad de la expresión, esta se evalúa y al valor obtenido es al que se le aplica la negación.

//Sintaxis
var a 
a = true

!a

// Ejemplo
var vacaciones = true
console.log( "Estamos de vacaciones..." + !vacaciones)

Nota:
Si se va a comparar si un valor es cierto o falso, se puede abreviar la comparación.

ar evaluar = true
if (evaluar) {
		console.log("if (evaluar) -> if (evaluar == true)")
	/*
		 Se va a ejecutar el código si la varible tiene el valor true.
		 Esto es igual a: 
		 evaluar == true
	*/
}

// Si se quiere evaluar el código cuando la variable no sea verdadera se puede utilizar:

if (!evaluar) {
		console.log("if (!evaluar) -> if (evaluar == false)")	
	/*
		 Se va a ejecutar el código si la varible tiene el valor true.
		 Esto es igual a: 
		 evaluar == false
	*/

}

Tablas de verdad

Conjunción

var p p && q var q
p = true q = true
p = true q = false
p = false q = true
p = false q = false

Disjunción

var p p || q var q
p = true q = true
p = true q = false
p = false q = true
p = false q = false

Negación

! p
p = true
p = false

Optimización

Las expresiones formadas por los operadores lógicos se evalúan de izquierda a derecha.
Es posible obtener una evaluación de corto circuito utilizando las siguientes reglas:

false && cualquier_cosa  // se evalúa como falso
true || cualquier_cosa // se evalúa como verdadero

De esta manera, si se estima que un término va a ser evaluado falso en una conjunción o va a ser evaluado como verdadero en una disjunción conviene posicionarlo en la primer posición para utilizar este tipo de evaluación y que se optimice un poco el código.