¿Qué es "x && foo()"?
Vi en otro lugar decir,
x && foo();
es igual a
if(x){
foo();
}
Lo probé y realmente hicieron lo mismo.
¿Pero por qué? ¿ Qué es exactamente x && foo()
?
Tanto los operadores AND como OR pueden atajar.
Por lo tanto, &&
solo prueba la segunda expresión si la primera es verdadera (más específicamente, verdadera). El hecho de que la segunda operación haga cosas (cualquiera que sea su contenido foo()
) no importa porque no se ejecuta a menos que la primera expresión se evalúe como algo verdadero. Si es cierto, se ejecutará para realizar la segunda prueba.
Por el contrario, si la primera expresión de una ||
afirmación es verdadera, la segunda no se modifica. Esto se hace porque ya se puede evaluar toda la declaración, la declaración resultará verdadera independientemente del resultado de la segunda expresión, por lo que se ignorará y no se ejecutará.
Los casos a tener en cuenta cuando se utilizan atajos como este, por supuesto, son los casos con operadores en los que las variables definidas aún se evalúan con valores falsos (p. ej. 0
) y verdaderos (p. ej. 'zero'
).
Esto se conoce como evaluación de cortocircuito .
En este caso, si x
es Falso, foo()
no es necesario evaluarlo (el resultado &&
siempre será Falso); si x
es Verdadero, es necesario evaluarlo (incluso si el resultado se descarta).
No es exactamente equivalente. La primera es una expresión con un valor de retorno que puedes usar; el segundo es una declaración.
Si no está interesado en el valor de retorno (es decir, la información sobre si ambos x
y foo()
se evalúan como un valor verdadero), son equivalentes, pero normalmente, debe usar la versión de lógica booleana solo si desea usarla como un valor booleano. expresión, por ejemplo:
if (x && foo()) {
do_stuff();
}
Si sólo está interesado en ejecutar foo()
condicionalmente (cuando x es verdadero), se preferirá la segunda forma, 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: tamaño del código fuente (un código fuente más detallado significa que se utiliza más ancho de banda); dado que la versión de lógica booleana utiliza menos caracteres, consume más ancho de banda. Todavía preferiría la versión más detallada la mayor parte del tiempo, a menos que el script 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 demás casos no lo es.
En javascript, el &&
operador evalúa de izquierda a derecha y devuelve el valor de la operación situada más a la derecha. Si la primera condición se evalúa como falsa, no se evalúa la segunda. Entonces es una abreviatura de decir " si algo no es nulo o no está definido, haz algo " .