Saltar al contenido

¿Cuál es la diferencia entre usar ‘&&’ y ‘||’ sobre un operador ternario (‘?’ y ‘:’)?

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 Helloy 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||Cse 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 );

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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