Pregunta ¿Una declaración javascript if con múltiples condiciones las prueba todas?


En javascript, cuando se utiliza una instrucción if con múltiples condiciones para probar, ¿las prueba javascript independientemente, o se bloqueará antes de probarlas todas si ya es falsa?

Por ejemplo:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

¿Comprobará javascript las 3 condiciones o, después de ver que b no es igual a 1, y por lo tanto es falso, saldrá de la declaración?

Lo pregunto desde el punto de vista del rendimiento. Si, por ejemplo, estoy probando 3 selectores jQuery complejos, preferiría no tener jQuery atravesar el DOM 3 veces si es obvio a través del primero que va a ser FALSO. (En cuyo caso tendría más sentido anidar 3 si las declaraciones).

ADDENDUM: Más curiosidad, ¿cuál es el término adecuado para esto? Noté que muchos de ustedes usan el término 'cortocircuito'. Además, ¿algunos idiomas hacen esto y otros no?


75
2017-12-18 20:26


origen


Respuestas:


los && "cortocircuitos" del operador, es decir, si la condición izquierda es falsa, no molesta evaluar la correcta.

Del mismo modo, el || cortocircuitos del operador si la condición izquierda es verdadera.

EDITAR: sin embargo, no debes preocuparte por el rendimiento hasta que hayas establecido un punto de referencia y determinado que es un problema. Micro optimización prematura es la pesadilla de la facilidad de mantenimiento.


111
2017-12-18 20:28



Desde el punto de vista del rendimiento, esto no es una micro-optimización.

Si tenemos 3 variables booleanas, a, b, c eso es una micro-optimización.

Si llamamos a 3 funciones que devuelven variables booleanas, cada función puede llevar mucho tiempo, y no solo es importante conocer estos cortocircuitos, sino en qué orden. Por ejemplo:

if (takesSeconds () && takesMinutes ())

es mucho mejor que

if (takesMinutes () && takesSeconds ())

si ambos tienen la misma probabilidad de devolver falso.


11
2017-12-18 21:21



Es por eso que puedes hacer en código javascript como

var x = x || 2;

Lo que significaría que si x no está definido o es "falso", entonces el valor predeterminado es 2.


9
2017-12-18 20:32



En caso de que alguien se pregunte si hay una forma de forzar la evaluación de todas las condiciones, en algunos casos los operadores bit a bit & y | puede ser usado

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

Estos deben ser utilizados muy cuidadosamente porque los operadores bit a bit son operadores aritméticos que trabajan en bits individuales de sus operandos y no siempre pueden funcionar como versiones "sin cortocircuito" de && y || 

Ejemplo:

-2147483648 && 1 = 1 

pero

-2147483648 & 1 = 0

Espero que ayude a alguien que llegó aquí buscando información como esta (como yo) y gracias a @Max por la corrección y el contraejemplo


9
2017-09-21 10:33



Solo probará todas las condiciones si las primeras son verdaderas, pruébelo usted mismo:

javascript: alert (false && alert("A") && false);

7
2017-12-18 20:29



Cortocircuitos: en su ejemplo solo se compararán ayb.


3
2017-12-18 20:29



Sale después de ver que b no es igual a uno.


2
2017-12-18 20:28



Otra razón por la cual se detiene la evaluación con 1 o más parámetros a la izquierda.

if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) { ... }

la segunda evaluación se basa en que la primera es verdadera y no arrojará un error de compilación si response.authResponse es nula o indefinida, etc. porque la primera condición falló.

Otros idiomas tuvieron este problema en los primeros días y creo que es un enfoque estándar en la construcción de compiladores ahora.


2
2018-05-07 00:50