switch - javascript operators
¿Qué es "x && foo()"? (5)
Vi que otro somewhere dijo,
x && foo();
es igual a
if(x){
foo();
}
Lo probé y realmente hicieron lo mismo.
¿Pero por qué? ¿Qué es exactamente x && foo()
?
En javascript, el operador &&
evalúa de izquierda a derecha y devuelve el valor de la operación más a la derecha. Si la primera condición se evalúa como falsa, no evalúa la segunda. Así que es una forma taquigráfica de decir " si algo no es nulo o indefinido, haz algo "
Es un cortocircuito.
El operador &&
funciona así: Hace el lógico o de los dos operandos en ambos lados. Si el lado izquierdo tiene un valor distinto de cero, entonces se evalúa el lado derecho para determinar el valor de verdad. Si el lado izquierdo es cero, sea cual sea el lado derecho, la expresión se evaluará a 0, por lo tanto, el lado derecho no se evalúa. Entonces, en efecto, si x
no es cero, entonces solo se llama a foo
, y si x
es 0, entonces no se llama a foo
, y por lo tanto, funciona como if - else
en este caso.
Esto se conoce como evaluación de cortocircuito .
En este caso, si x
es False, entonces foo()
no necesita ser evaluado (el resultado de &&
siempre será False); si x
es verdadero, necesita ser evaluado (incluso si el resultado se descarta).
No es exactamente equivalente. El primero es una expresión con un valor de retorno que puede usar; el segundo es una declaración.
Si no está interesado en el valor de retorno (es decir, la información sobre si x
y foo()
evalúan a un valor verdadero), son equivalentes, pero normalmente, debe usar la versión de lógica booleana solo si desea usar como una expresión booleana, por ejemplo:
if (x && foo()) {
do_stuff();
}
Si solo está interesado en ejecutar foo()
condicionalmente (cuando x es verdad), la segunda forma es preferible, ya que transmite la intención más claramente.
Una razón por la que la gente podría preferir la versión de lógica booleana podría ser que javascript está sujeto a una restricción inusual: el tamaño del código fuente (un código fuente más detallado significa más ancho de banda utilizado); dado que la versión de lógica booleana usa menos caracteres, es más eficiente en cuanto al ancho de banda. Todavía preferiría la versión más detallada la mayor parte del tiempo, a menos que el guión en cuestión se use mucho, para una biblioteca como jQuery, usar optimizaciones como esta es perfectamente justificable, pero en la mayoría de los casos no lo es.
Los operadores AND y OR pueden atacar.
Por lo tanto, &&
solo intenta la segunda expresión si la primera es verdadera (similar a la verdad, más específicamente). El hecho de que la segunda operación haga cosas (sea cual sea el contenido de foo()
) no importa porque no se ejecuta a menos que esa primera expresión evalúe algo veraz. Si es verdad, entonces se ejecutará para probar la segunda prueba.
Por el contrario, si la primera expresión en un ||
la declaración es verdadera, la segunda no se toca. Esto se hace porque toda la declaración ya puede ser evaluada, la declaración dará como resultado verdadero independientemente del resultado de la segunda expresión, por lo que se ignorará y permanecerá sin ejecutar.
Los casos a tener en cuenta cuando se usan accesos directos como este, por supuesto, son los casos con operadores donde las variables definidas todavía evalúan a los valores falsy (por ejemplo, 0
), y los verdaderos (por ejemplo, ''zero''
).