Eduardo, miembro de este equipo de trabajo, nos hizo el favor de escribir esta crónica porque conoce a la perfección el tema.
Solución:
Estos son dos conceptos diferentes que dan la misma respuesta.
El primer ejemplo usa el operador ternario y su resultado depende solamente en el primer operando (en tu ejemplo true
/false
):
true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"
Es una forma abreviada de un if
/else
. Si el primer operando es verdadero, devuelve el segundo operando (Hello
). Si el primer operando es falso, devuelve el tercer operando (Goodbye
).
La primera expresión de su primer ejemplo se puede reescribir como:
if (true)
return 'Hello';
else
return 'Goodbye';
El segundo ejemplo hace uso de operadores lógicos y su resultado depende de ambas cosas el primer y el segundo operando.
true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"
Si firstOperand && secondOperand
evalúa a un valor verdadero, devuelve secondOperand
. Si evalúan algo falso, devuelven thirdOperand
(Goodbye
).
En sus ejemplos, dado que un no vacío string es verdad, true && 'Hello'
evalúa a Hello
y false && 'Hello'
evalúa a false
.
Entonces tu segundo ejemplo se convierte en:
'Hello' || 'Goodbye'
false || 'Goodbye'
por como ||
funciona, eso genera lo que genera su primer ejemplo, pero son conceptos diferentes.
Observe cómo en el primer ejemplo, sabemos qué devolver después de evaluar el primer operando. En el segundo ejemplo, tenemos que evaluar el primero dos operandos antes de que sepamos qué devolver.
operador ternario
Esta es una mano corta de if else
.
true ? 'Hello' : 'Goodbye'
es equivalente a
if (true)
'Hello'
else
'Goodbye'
predicados lógicos
mientras true && 'Hello' || 'Goodbye'
no es un if else
condición
true && 'Hello' || 'Goodbye'
es equivalente a
(true && 'Hello') || 'Goodbye'
Esto resulta en Hello
pero se basa en la precedencia. Considere el caso de
'Goodbye' || (true && 'Hello')
Esto resultará en Goodbye
. Cambiar el orden cambia la salida, pero eso no sucede con un operador ternario.
Parece que no hay diferencia en el resultado. PERO tuve una suposición sobre cómo se procesan. ()?:
es en realidad un poco más rápido que &&||
(Vea la demostración a continuación).
(A)B?C:
básicamente es un IF-taquigrafía, por lo que el (A)
parte se evalúa y el B then
o C else
se recoge la pila.
(A)&&B||C
se evalúa por completo. Primero el (A)
se evalúa. Después de eso, ocurre una conversión implícita (conversión booleana), lo que lleva un poco de tiempo
false – gracias a “Gust van de Wal”
Todavía una diferencia: violín
var max = 1e7;
var start1 = (new Date()).getTime();
for( var i = 0; i < max; i++)
let a = (i%2) ? max-i : max+1;
let b = (i%3) ? max-i : max+i;
var stop1 = (new Date()).getTime();
var start2 = (new Date()).getTime();
for( var i = 0; i < max; i++)
var stop2 = (new Date()).getTime();
console.log( (new Date()).getTime() );
console.log( stop1 -start1 );
console.log( stop2 -start2 );