Explicación de la asignación de variables JavaScript OR (||)

Resuelto chattsm asked hace 14 años • 12 respuestas

Dado este fragmento de JavaScript...

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

¿Alguien puede explicarme cómo se llama esta técnica (¡mi mejor suposición está en el título de esta pregunta!)? ¿Y cómo/por qué funciona exactamente?

Tengo entendido que a la variable fse le asignará el valor más cercano (de izquierda a derecha) de la primera variable que tenga un valor que no sea nulo o indefinido, pero no he logrado encontrar mucho material de referencia sobre esta técnica y he visto que se usa mucho.

Además, ¿esta técnica es específica de JavaScript? Sé que hacer algo similar en PHP daría como resultado fun valor booleano verdadero, en lugar del valor en dsí mismo.

chattsm avatar Jan 20 '10 17:01 chattsm
Aceptado

Consulte la evaluación de cortocircuito para obtener una explicación. Es una forma común de implementar estos operadores; no es exclusivo de JavaScript.

unwind avatar Jan 20 '2010 10:01 unwind

Esto se hace para asignar un valor predeterminado , en este caso el valor de y, si la xvariable es falsa .

Los operadores booleanos en JavaScript pueden devolver un operando, y no siempre un resultado booleano como en otros lenguajes.

El operador lógico OR ( ||) devuelve el valor de su segundo operando, si el primero es falso; en caso contrario, se devuelve el valor del primer operando.

Por ejemplo:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Los valores falsos son aquellos que coaccionan cuando se usan en un falsecontexto booleano, y son 0,,, una cadena vacía y, por supuesto ,.nullundefinedNaNfalse

Christian C. Salvadó avatar Jun 21 '2010 20:06 Christian C. Salvadó

Javacript utiliza evaluación de cortocircuito para operadores lógicos ||y &&. Sin embargo, se diferencia de otros lenguajes en que devuelve el resultado del último valor que detuvo la ejecución, en lugar de un valor trueo false.

Los siguientes valores se consideran falsos en JavaScript.

  • FALSO
  • nulo
  • ""(cuerda vacía)
  • 0
  • Yaya
  • indefinido

Ignorando las reglas de precedencia de operadores 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 NaNson falsos, por lo que todos se evalúan de izquierda a derecha, hasta que se encuentra con el primer valor verdadero, "Hello"lo que hace que toda la expresión sea verdadera, por lo que cualquier valor posterior 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 alcanzan el primer valor falso ( null), lo que hace que la expresión sea falsa 2010, por lo que ya no se evalúa y nullse devuelve como resultado de la expresión.

El ejemplo que ha dado hace uso de esta propiedad de JavaScript para realizar una tarea. Se puede utilizar 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 bya que facilita la asignación de un valor predeterminado, en lugar de realizar comprobaciones if-else.

var a = false;
var b = a || "Hello";

Se podría llamar al siguiente ejemplo 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 messageses falso y, en caso afirmativo, evaluamos y devolvemos noNewMessagesText; de lo contrario, evaluamos y devolvemos newMessagesText. Como en este ejemplo es falso, nos detenemos en noNewMessagesText y alertamos "Sorry, you have no new messages.".

Anurag avatar Jun 21 '2010 21:06 Anurag

Las variables de Javascript no están escritas, por lo que a f se le puede asignar un valor entero aunque se haya asignado mediante operadores booleanos.

A f se le asigna el valor más cercano que no sea equivalente a false . Entonces 0, falso, nulo, indefinido, se pasan por alto:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Alsciende avatar Jan 20 '2010 10:01 Alsciende