¿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 true
y 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 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*/));
se obtiene "Either x or y is truthy."
.
Si x
fuera falsey, eitherXorY
lo sería y
. En este caso, obtendría el "Either x or y is truthy."
if y
era 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 || y
significa. Si x
es veraz, x
se le asigna x
, por lo que en realidad no sucede 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 una mala práctica de programación , ya que evita que pase un valor falsey (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 pasara 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 manera de establecer flagA
a false
.
Sería una mejor idea verificar explícitamente si flagA
es undefined
así:
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 || true
es suficiente para hacerme llorar. (es decirdoWeDoIt
, ahora nunca lo seráfalse
)