¿Qué es el operador de doble tubo ( ||)?
El operador de doble tubería ( ||) es el operador lógicoOR . En la mayoría de los idiomas funciona de la siguiente manera:
- Si el primer valor es
false, verifica el segundo valor. Si es así true, vuelve truey si lo es false, vuelve false.
- Si el primer valor es
true, siempre regresa true, sin importar 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 comprende, mire esta tabla:
| true false
------+---------------
true | true true
false | true false
En otras palabras, solo es falso cuando ambos valores son falsos.
¿Cómo es diferente en JavaScript?
JavaScript es un poco diferente, porque es un lenguaje poco escrito . En este caso, significa que puede usar el ||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(){}) || {}
Que pasa alli
Si los valores no son booleanos, JavaScript realiza una conversión implícita a booleano . Esto significa que si el valor es Falsey (por ejemplo 0, "", null, undefined(véase también Todos los valores Falsey en JavaScript )), que será tratado 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. Pues no. Devuelve la función vacía. Eso es porque el ||operador de JavaScript no funciona como escribí al principio. Funciona de la siguiente manera:
- Si el primer valor es falsey , devuelve el segundo valor .
- Si el primer valor es verdadero , devuelve el primer valor .
¿Sorprendido? En realidad, es "compatible" con el ||operador tradicional . 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, devuelve x, es decir, un valor de verdad. Entonces, si lo usa más adelante en la ifclá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*/));
se obtiene "Either x or y is truthy.".
Si xfuera falsey, eitherXorYlo sería y. En este caso, obtendría el "Either x or y is truthy."if yera verdadero; de lo contrario lo conseguirías "Neither x nor y is truthy".
La pregunta real
Ahora, cuando sabes cómo ||funciona el operador, probablemente puedas entender por ti mismo lo que x = x || ysignifica. Si xes veraz, xse le asigna x, por lo que en realidad no sucede nada; de lo contrario yestá asignado a x. Se usa comúnmente para definir parámetros predeterminados en funciones. Sin embargo, a menudo se considera una mala práctica de programación , ya que evita que pase un valor falsey (que no es necesariamente undefinedo 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 pasara falsecomo flagAparámetro (ya que es booleano, es decir, puede ser trueo false)? Se convertiría true. En este ejemplo, no hay manera de establecer flagAa false.
Sería una mejor idea verificar explícitamente si flagAes undefinedasí:
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 puede usar la sintaxis ES6 para los parámetros de función predeterminados , pero tenga en cuenta que no funciona en navegadores antiguos (como IE). Si desea admitir estos navegadores, debe transpilar su código con Babel .
Ver también Operadores lógicos en MDN .
falsy, no SOLOundefined. La cantidad de veces que he vistodoWeDoIt = doWeDoIt || truees suficiente para hacerme llorar. (es decirdoWeDoIt, ahora nunca lo seráfalse)