2010-04-06 824 views
6

He estado buscando en el código fuente de raphael.js y veo un montón de cosas por el estilo !variable && function() (ej .: !svg.bottom && (svg.bottom = this);)JavaScript idioma: algo función &&()

¿Qué es exactamente lo que? ¿Verifica primero y ejecuta solo si no es verdad?

Respuesta

4

Correcto. Esto es (ab) usando la evaluación de cortocircuito. Una expresión booleana solo se ejecuta tanto como sea necesario para determinar el resultado. En su ejemplo, si svg.bottom no es nulo, entonces !svg.bottom es false, y el resultado de && es false, por lo que la ejecución del lado derecho no ocurre. Es básicamente equivalente a if(!svg.bottom)svg.bottom = this;

6

Utiliza reglas de cortocircuito para realizar la segunda parte de la expresión (que en realidad incluye la asignación) solo si la primera parte (!svg.bottom) no es falsa. Es decir, si svg.bottom es null - establézcalo en this.

+5

'! Svg.bottom && (svg.bottom = this);' es bastante extraño ... sería más simple hacer 'svg.bottom = svg.bottom || esto'. – James

+0

@EFraim, no solo si 'svg.bottom' es' null', también si 'undefined',' 0', 'NaN' es una cadena vacía, y por supuesto' false'. – CMS

+0

Sí, es como una declaración abreviada 'if', aunque sería más claro usar if (! Svg.bottom) { svg.bottom = this; } –

0

Javascript tiene muchas convenciones de conversión extrañas. El operador ! lanzará a booleano. Si la prueba falla, la parte posterior al && no se ejecutará.

Algunos ejemplos:
!undefined es cierto
!false es cierto
!0 es cierto !1 es falso
!"hello" es falso

+2

! "Hola" es falso ... –

+1

Aunque creo que '!" "' Es 'verdad'. –

+0

Eso es correcto. Compruebe la especificación: =] http://bclary.com/2004/11/07/#a-9.2 –

0

Hay dos maneras prácticas de uso de los operadores lógicos en JS, porque son no meramente operadores booleanos.

Con &&, puede decir "si esta expresión es verdadera, es seguro evaluar la siguiente expresión". El uso más común es para comprobar si una propiedad no es nulo antes de excavar más en su interior:

var result = myObj.person && myObj.person.firstName; 

Si myObj.person no está definido, el valor de result serán indefinidos también.

Con ||, se puede decir "toma el valor de esta expresión si es Truthy (no nulo o no definido en este contexto), caso contrario utilice un defecto":

var result = person.firstName || "Sid"; 

combinación de los dos:

var result = (myObj.person && myObj.person.firstName) || "Sid"; 

Una forma rápida de decir "obtener el firstName de la propiedad person de myObj, o use 'Sid' si el person no tiene firstName o myObj no tiene person ".

Sin embargo, el ejemplo al que se refiere es un tanto extraño. Hacer una operación de efecto secundario dentro de una expresión es un poco feo. Por lo general, es más fácil hacer un seguimiento de lo que está haciendo su programa si separa claramente las expresiones de "solo lectura" de las declaraciones de mutación variable.

4

Cuando tiene operaciones booleanas, el compilador iniciar comprobar el uno por el otro, y se detendrá cuando el seguro de los resultados - por ejemplo, si le preguntas a

if(a && b && c) 
{  
} 

si un es falso, entonces el booleano es falso, y el compilador no necesita comprobar byc. Este futuro del compilador se usa para abreviar el código de escritura para algunos casos.

Esto es (para mí) una mala práctica que la escritura de código.

!variable && function() 

instide de

if(!variable) function(); 

tratar de minimizar el tamaño del Javascript?

Dificil de depurar, y es difícil encontrar lo que realmente dosifica en muchos casos.

Consulte este código similar.

unsigned uCycleCheckBox(unisgned uCur) 
{ 
    return ((uCur <= 1) ? (uCur?0:1) : (uCur==4)?2:(uCur+1)); 
} 

es el mismo que ... difícil de entender, difícil de depurar, difíciles de cambiar y corregir en caso de problemas.

Para los comentarios sobre eso, sugiero leer los libros, Escribir código sólido y Debbuging el proceso de desarrollo.

Escribir código sólido es más importante que en todo lo demás.

+0

Tal vez están jugando al golf;) – kennytm

+0

¿Qué es difícil de entender? ;) – EFraim

+0

Y solo la existencia de la pregunta, debe hacer que piense de nuevo, sí es difícil entender rápidamente qué es el código, también es difícil de depurar, y la creación de imágenes de que el código no es solo para el que lo escribe. – Aristos