Javacript utiliza la evaluación de cortocircuito para operadores lógicos ||
y &&
. Sin embargo, es diferente a otros idiomas en que devuelve el resultado del último valor que detuvo la ejecución, en lugar de un valor true
o false
.
Los siguientes valores se consideran falsos en JavaScript.
- falso
- nulo
""
(cuerda vacía)
- 0 0
- Yaya
- indefinido
Ignorando las reglas de precedencia del operador y manteniendo las cosas simples, los siguientes ejemplos muestran qué valor detuvo la evaluación y se devuelve como resultado.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Los primeros 5 valores hasta NaN
son falsos, por lo que todos se evalúan de izquierda a derecha, hasta que cumpla con el primer valor "Hello"
verdadero, lo que hace que toda la expresión sea verdadera, por lo que todo lo que esté más arriba no se evaluará y "Hello"
se devolverá como resultado de la expresión . Del mismo modo, en este caso:
1 && [] && {} && true && "World" && null && 2010 // null
Los primeros 5 valores son todos verdaderos y se evalúan hasta que cumple con el primer valor falso ( null
) que hace que la expresión sea falsa, por 2010
lo que ya no se evalúa y null
se devuelve como resultado de la expresión.
El ejemplo que ha dado es hacer uso de esta propiedad de JavaScript para realizar una tarea. Se puede usar en cualquier lugar donde necesite obtener el primer valor verdadero o falso entre un conjunto de valores. Este código a continuación asignará el valor "Hello"
a b
, ya que facilita la asignación de un valor predeterminado, en lugar de hacer verificaciones if-else.
var a = false;
var b = a || "Hello";
Podría llamar al ejemplo siguiente una explotación de esta característica, y creo que hace que el código sea más difícil de leer.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Dentro de la alerta, verificamos si messages
es falso y, en caso afirmativo, evaluamos y devolvemos noNewMessagesText
, de lo contrario, evaluamos y devolvemos newMessagesText
. Como es falso en este ejemplo, nos detenemos en noNewMessagesText y alertamos "Sorry, you have no new messages."
.
$f=$a or $f=$b or $f=$c; // etc
. PHP tiene tanto el||
operador como elor
operador, que hacen el mismo trabajo; sin embargo,or
se evalúa después de la asignación mientras||
se evalúa antes. Esto también le da el estilo de$a=getSomething() or die('oops');