2011-08-07 16 views
40

vi somewhere más dijo,¿Qué es "x && foo()"?

x && foo();

es igual a

if(x){ 
    foo(); 
} 

lo probé y realmente hice lo mismo.
¿Pero por qué? ¿Qué es exactamente x && foo()?

+28

Aunque este es un truco hábil, espero que no lo use. Funciona, pero se considera de mala forma. –

+4

Sí, estoy de acuerdo con @PortableWorld. 'if (x) {foo();}' o incluso 'if (x) foo();' en una sola línea sería casi tan comprensible, uso más general. – Kzqai

+4

Pero tenga cuidado de no confundir esto con 'if (x && foo()) {...}' que es aceptable y tiene un significado diferente. Yo, por mi parte, no me importa 'x && foo()', especialmente si cosas como esta se arrastran mucho ... JS se beneficia de la minimización. – vol7ron

Respuesta

64

Ambos operadores AND y OR pueden hacer un atajo.

Así que && 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 hace cosas (sea cual sea el contenido de foo() hace) no importa porque no es ejecutado a menos que primera expresión se evalúa como algo Truthy. Si es verdad, entonces se ejecutará para probar la segunda prueba.

Por el contrario, si la primera expresión en una 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 valores falsy (por ejemplo 0) y verdaderos (por ejemplo, 'zero').

+3

Compruebe la especificación de sintaxis de su idioma para asegurarse de que su idioma sigue la misma regla de finalización de ejecución de acceso directo. Los lenguajes heredados existen que lo violan. –

+0

En realidad, en Delphi puedes apagarlo para todo el proyecto, un archivo específico o incluso alrededor de una determinada función ... Cosas locas :) http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN /html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html –

+5

@John: la pregunta especifica javascript ... –

3

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 abreviatura de decir "si algo no es nulo o indefinido, haga algo"

24

Esto se conoce como short-circuit evaluation.

En este caso, si x es False, entonces foo() no necesita evaluación (el resultado de && siempre será False); si x es verdadero, necesita ser evaluado (incluso si el resultado se descarta).

+0

Ah, el artículo de wikipedia ciertamente lo cubre todo. Como siempre. – Kzqai

+4

@Tchalvak: Sí ... ¡si sabes qué buscar! – Johnsyweb

2

Es un corto circuito.

El operador && funciona de la siguiente manera: Hace lo 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, cualquiera que sea el lado derecho, la expresión se evaluará a 0, por lo tanto, el lado derecho es no evaluado. Entonces, en efecto, si x es distinto de 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.

8

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 de si tanto x y foo() se evalúan como un valor Truthy), son equivalentes, pero normalmente, debe utilizar la versión booleano en la lógica sólo si desea para utilizarlo como una expresión booleana, por ejemplo:

if (x && foo()) { 
    do_stuff(); 
} 

Si sólo está interesado en el funcionamiento foo() condicionalmente (cuando x es Truthy), 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 lógica booleana podría ser que javascript está sujeto a una restricción inusual: tamaño del código fuente (más código fuente 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.

Cuestiones relacionadas