Estoy depurando algunos JavaScript y no puedo explicar qué ||
hace esto .
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
¿Alguien puede darme una pista, por qué este tipo está usando var title = title || 'ERROR'
? A veces también lo veo sin una var
declaración.
javascript
parameters
optional-parameters
or-operator
opHASnoNAME
fuente
fuente
falsy
, no SOLOundefined
. La cantidad de veces que he vistodoWeDoIt = doWeDoIt || true
es suficiente para hacerme llorar. (es decirdoWeDoIt
, ahora nunca lo seráfalse
)??
. Javascript evalúa objetos no nulos comotrue
(o mejor evalúa objetos nulos como falsos)Respuestas:
Significa que el
title
argumento es opcional. Entonces, si llama al método sin argumentos, usará un valor predeterminado de"Error"
.Es una forma abreviada de escribir:
Este tipo de truco abreviado con expresiones booleanas también es común en Perl. Con la expresión:
se evalúa
true
si ya seaa
ob
estrue
. Entonces, sia
es cierto, no necesita verificarlob
en absoluto. Esto se llama evaluación booleana de cortocircuito, entonces:básicamente comprueba si se
title
evalúa afalse
. Si lo hace, "regresa""Error"
, de lo contrario, regresatitle
.fuente
¿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:false
, verifica el segundo valor. Si es asítrue
, vuelvetrue
y si lo esfalse
, vuelvefalse
.true
, siempre regresatrue
, sin importar cuál sea el segundo valor.Entonces, básicamente funciona como esta función:
Si aún no lo comprende, mire esta tabla:
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: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 comofalse
; de lo contrario se trata comotrue
.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:¿Sorprendido? En realidad, es "compatible" con el
||
operador tradicional . Podría escribirse como la siguiente función:Si pasa un valor de verdad como
x
, devuelvex
, es decir, un valor de verdad. Entonces, si lo usa más adelante en laif
cláusula:se obtiene
"Either x or y is truthy."
.Si
x
fuera falsey,eitherXorY
lo seríay
. En este caso, obtendría el"Either x or y is truthy."
ify
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 quex = x || y
significa. Six
es veraz,x
se le asignax
, por lo que en realidad no sucede nada; de lo contrarioy
está asignado ax
. 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 necesariamenteundefined
onull
) como parámetro. Considere el siguiente ejemplo:Parece válido a primera vista. Sin embargo, ¿qué pasaría si pasara
false
comoflagA
parámetro (ya que es booleano, es decir, puede sertrue
ofalse
)? Se convertiríatrue
. En este ejemplo, no hay manera de establecerflagA
afalse
.Sería una mejor idea verificar explícitamente si
flagA
esundefined
así: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 .
fuente
title = title || 'Error'
significaif (title) { title = title; } else { title = 'Error'; }
title ||= 'Error'
.Si el título no está configurado, use 'ERROR' como valor predeterminado.
Más genérico:
Lee: establece foobar en
foo
odefault
. Incluso podrías encadenar esto muchas veces:fuente
Explicando esto un poco más ...
El
||
operador es elor
operador lógico . El resultado es verdadero si la primera parte es verdadera y es verdadero si la segunda parte es verdadera y es verdadero si ambas partes son verdaderas. Para mayor claridad, aquí está en una tabla:¿Ahora notas algo aquí? Si
X
es verdadero, el resultado siempre es verdadero. Entonces, si sabemos que esoX
es cierto, no tenemos que verificarloY
en absoluto. Muchos lenguajes implementan así evaluadores de "cortocircuito" para lógicaor
(y lógica queand
proviene de la otra dirección). Comprueban el primer elemento y, si eso es cierto, no se molestan en comprobar el segundo. El resultado (en términos lógicos) es el mismo, pero en términos de ejecución existe una gran diferencia si el segundo elemento es costoso de calcular.Entonces, ¿qué tiene esto que ver con tu ejemplo?
Miremos eso. El
title
elemento se pasa a su función. En JavaScript, si no pasa un parámetro, su valor predeterminado es nulo. También en JavaScript, si su variable es un valor nulo, los operadores lógicos lo consideran falso. Entonces, si esta función se llama con un título dado, es un valor no falso y, por lo tanto, se asigna a la variable local. Sin embargo, si no se le da un valor, es un valor nulo y, por lo tanto, falso. Elor
operador lógico luego evalúa la segunda expresión y devuelve 'Error' en su lugar. Entonces ahora la variable local recibe el valor 'Error'.Esto funciona debido a la implementación de expresiones lógicas en JavaScript. No devuelve un valor booleano adecuado (
true
ofalse
), sino que devuelve el valor que se le dio según algunas reglas en cuanto a lo que se considera equivalentetrue
y a lo que se considera equivalentefalse
. Busque su referencia de JavaScript para conocer lo que JavaScript considera verdadero o falso en contextos booleanos.fuente
La tubería doble significa "OR" lógico. Este no es realmente el caso cuando el "parámetro no está configurado", ya que estrictamente en JavaScript si tiene un código como este:
Luego llama
No son equivalentes.
Double pipe (||) convertirá el primer argumento en booleano y, si el booleano resultante es verdadero, haga la asignación; de lo contrario, asignará la parte correcta.
Esto es importante si verifica el parámetro no establecido.
Digamos que tenemos una función setSalary que tiene un parámetro opcional. Si el usuario no proporciona el parámetro, se debe usar el valor predeterminado de 10.
si haces el chequeo así:
Esto dará un resultado inesperado en llamadas como
Todavía establecerá el 10 siguiendo el flujo descrito anteriormente.
fuente
Básicamente verifica si el valor antes de || se evalúa como verdadero, en caso afirmativo, toma este valor, si no, toma el valor después de ||.
Valores para los cuales tomará el valor después de || (hasta donde recuerdo):
fuente
Si bien la respuesta de Cletus es correcta, creo que se deben agregar más detalles con respecto a "evalúa como falso" en JavaScript.
No es solo verificar si se ha proporcionado título / mensaje, sino también si alguno de ellos es falso . es decir, uno de los siguientes:
Entonces en la linea
Si title es verdadero (es decir, no falso, entonces title = "titleMessage", etc.), entonces el operador booleano OR (||) ha encontrado un valor 'verdadero', lo que significa que se evalúa como verdadero, por lo que cortocircuita y devuelve El verdadero valor (título).
Si el título es falso (es decir, uno de la lista anterior), el operador booleano OR (||) ha encontrado un valor 'falso' y ahora necesita evaluar la otra parte del operador, 'Error', que se evalúa como verdadero y, por lo tanto, se devuelve.
También parecería (después de una rápida experimentación con la consola Firebug) si ambos lados del operador evalúan como falso, devuelve el segundo operador 'falso'.
es decir
devuelve indefinido, esto es probablemente para permitirle usar el comportamiento sobre el que se preguntó en esta pregunta al intentar asignar un título / mensaje predeterminado a "". es decir, después de correr
foo se establecería en ""
fuente
operador de doble tubo
¿Es útil este ejemplo?
puede también ser
fuente
Para agregar alguna explicación a todo lo dicho antes que yo, debo darle algunos ejemplos para comprender los conceptos lógicos.
Significa que si el lado izquierdo se evalúa como una declaración verdadera, se terminará y el lado izquierdo se devolverá y se asignará a la variable. en otros casos, el lado derecho será devuelto y asignado.
Y el operador tiene la estructura opuesta como a continuación.
fuente
|| es el operador booleano OR. Como en JavaScript, undefined, null, 0, false se consideran valores falsos .
Simplemente significa
fuente
Cita: "¿Qué significa la construcción x = x || y?"
Asignación de un valor predeterminado.
Esto significa proporcionar un valor predeterminado de y a x , en caso de que x todavía esté esperando su valor pero aún no lo haya recibido o se haya omitido deliberadamente para volver a un valor predeterminado.
fuente
function getKeys(x) { x = x || this ; .... }
que podría usarse sin modificación como una función independiente, como un método de propiedad en prototipos y como un método de un elemento que puede obtener otro elemento como argumento como `[element] .getKeys (anotherElement);`Y tengo que agregar una cosa más: este poco de taquigrafía es una abominación. Hace un mal uso de una optimización accidental del intérprete (sin molestarse con la segunda operación si la primera es verdadera) para controlar una asignación. Ese uso no tiene nada que ver con el propósito del operador. No creo que deba usarse alguna vez.
Prefiero el operador ternario para la inicialización, por ejemplo,
Esto utiliza una operación condicional de una línea para su propósito correcto. Todavía juega juegos antiestéticos con veracidad, pero eso es Javascript para ti.
fuente