&
es bit a bit Y
Este operador espera dos números y devuelve un número. En caso de que no sean números, se convierten en números.
¿Como funciona? Wikipedia tiene una respuesta: https://en.wikipedia.org/wiki/Bitwise_operation#AND
Nota: En Javascript, se desaconseja el uso de este operador , ya que no hay un tipo de datos entero, solo un punto flotante. Por lo tanto, los flotantes se convierten en números enteros antes de cada operación, lo que la hace lenta. Además, no tiene un uso real en aplicaciones web típicas y produce código ilegible.
Regla general: evitar. No lo use. Rara vez tiene lugar en un código JS fácil de mantener y leer.
&&
es lógico Y
Espera dos argumentos y devuelve:
- Primer término que se evalúa como falso
- Último término de lo contrario (si todos son verdaderos)
Aquí hay unos ejemplos:
0 && false 0 (both are false-y, but 0 is the first)
true && false false (second one is false-y)
true && true true (both are true-y)
true && 20 20 (both are true-y)
Si solo lo usa en booleano, este es exactamente el operador AND de la lógica matemática.
&&
encadenamiento de operadores
La razón por la que este operador se define como anteriormente es el encadenamiento de operadores. Puede encadenar este operador y seguir manteniendo las reglas anteriores.
true && 20 && 0 && 100 0 (it is the first false-y)
10 && 20 && true && 100 100 (last one, since all are true-y)
&&
cortocircuito
Como puede verse en la definición, tan pronto como descubra que un término es falso, no debe preocuparse por los siguientes términos. Javascript incluso lleva esto un poco más allá, los términos ni siquiera se evalúan. A esto se le llama cortocircuito.
true && false && alert("I am quiet!")
Esta declaración no alerta nada y false
se devuelve. Por lo tanto, puede usar el &&
operador como un reemplazo más corto de una declaración if. Estos son equivalentes:
if (user.isLoggedIn()) alert("Hello!")
user.isLoggedIn() && alert("Hello!")
Casi todos los compresores JS usan este truco para ahorrar 2 bytes.
fruits.length & veggies.length === 0
, y boolean:fruits.length && veggies.length === true
.