in

javascript – ¿Qué significa la construcción x = x || ¿Quieres decir?

apple touch icon@2

El operador de doble tubo (||) es el lógico OR operador . En la mayoría de los idiomas funciona de la siguiente manera:

  • Si el primer valor es false, comprueba el segundo valor. Si eso es true, vuelve true y si el segundo valor es false, vuelve false.
  • Si el primer valor es truesiempre vuelve true, no importa cuál sea el segundo valor.

Entonces, básicamente, funciona como esta función:

function or(x, y) {
  if (x) {
    return true;
  } else if (y) {
    return true;
  } else {
    return false;
  }
}

Si aún no lo entiende, mire esta tabla:

      | true   false  
------+---------------
true  | true   true   
false | true   false  

En otras palabras, solo es falso cuando ambos valores son falsos.

JavaScript es un poco diferente, porque es un lenguaje vagamente escrito. En este caso significa que puede utilizar || operador con valores que no son booleanos. Aunque no tiene sentido, puede usar este operador con, por ejemplo, una función y un objeto:

(function(){}) || {}

¿Qué pasa ahí?

Si los valores no son booleanos, JavaScript hace conversión implícita a booleana. Significa que si el valor es falso (p. Ej. 0, "", null, undefined (ver también Todos los valores falsey en JavaScript)), se tratará como false; de lo contrario, se trata como true.

Entonces, el ejemplo anterior debería dar true, porque la función vacía es verdadera. Bueno, no es así. Devuelve la función vacía. Eso es porque JavaScript || El operador no funciona como escribí al principio. Funciona de la siguiente manera:

  • Si el primer valor es Falsey, vuelve el segundo valor.
  • Si el primer valor es veraz, vuelve el primer valor.

¿Sorprendido? De hecho, es «compatible» con el tradicional || operador. Podría escribirse como la siguiente función:

function or(x, y) {
  if (x) {
    return x;
  } else {
    return y;
  }
}

Si pasa un valor de verdad como x, vuelve x, es decir, un valor de verdad. Entonces, si lo usa más tarde en if cláusula:

(function(x, y) {
  var eitherXorY = x || y;
  if (eitherXorY) {
    console.log("Either x or y is truthy.");
  } else {
    console.log("Neither x nor y is truthy");
  }
}(true/*, undefined*/));

usted obtiene "Either x or y is truthy.".

Si x fue falso, eitherXorY sería y. En este caso obtendrías el "Either x or y is truthy." si y fue veraz; de lo contrario obtendrías "Neither x nor y is truthy".

Ahora, cuando sepas como || El operador funciona, probablemente puedas distinguir por ti mismo lo que x = x || y significar. Si x es veraz, x está asignado a x, entonces en realidad no pasa nada; de lo contrario y está asignado a x. Se usa comúnmente para definir parámetros predeterminados en funciones. Sin embargo, a menudo se considera un mala práctica de programación, porque le impide pasar un valor falso (que no es necesariamente undefined o null) como parámetro. Considere el siguiente ejemplo:

function badFunction(/* boolean */flagA) {
  flagA = flagA || true;
  console.log("flagA is set to " + (flagA ? "true" : "false"));
}

Parece válido a primera vista. Sin embargo, ¿qué pasaría si pasaras false como flagA parámetro (ya que es booleano, es decir, puede ser true o false)? Se convertiría true. En este ejemplo, no hay forma de configurar flagA para false.

Sería una mejor idea comprobar explícitamente si flagA es undefined, como eso:

function goodFunction(/* boolean */flagA) {
  flagA = typeof flagA !== "undefined" ? flagA : true;
  console.log("flagA is set to " + (flagA ? "true" : "false"));
}

Aunque es más largo, siempre funciona y es más fácil de entender.


También puedes usar la sintaxis de ES6 para los parámetros de función predeterminados, pero tenga en cuenta que no funciona en navegadores más antiguos (como IE). Si desea admitir estos navegadores, debe transpilar su código con Babel.

Ver también Operadores lógicos en MDN.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Mercado monetario internacional

AVps5dvY37SNe87hXFVQEK 1200 80

Consejos de Days Gone: consejos y trucos de 13 Days Gone para el apocalipsis de Freaker