¿Qué es "x && foo()"?

Resuelto Derek 朕會功夫 asked hace 13 años • 5 respuestas

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()?

Derek 朕會功夫 avatar Aug 07 '11 09:08 Derek 朕會功夫
Aceptado

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').

Kzqai avatar Aug 07 '2011 02:08 Kzqai

Esto se conoce como evaluación de cortocircuito .

En este caso, si xes Falso, foo()no es necesario evaluarlo (el resultado &&siempre será Falso); si xes Verdadero, es necesario evaluarlo (incluso si el resultado se descarta).

johnsyweb avatar Aug 07 '2011 02:08 johnsyweb

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 xy 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.

tdammers avatar Aug 07 '2011 12:08 tdammers

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 " .

Mrchief avatar Aug 07 '2011 02:08 Mrchief