2012-04-03 12 views
11

Noté algo un poco extraño con el compilador de CoffeeScript y me preguntaba si este era el comportamiento correcto o no. Si es correcto que tengo curiosidad por qué hay una diferencia ..CoffeeScript Operador existencial y este

Dada la siguiente CoffeeScript:

if @myVar? 
    alert myVar 

que estaba esperando para compilar tener JavaScript así:

if (typeof this.myVar !== "undefined" && this.myVar !== null) { 
    alert(myVar); 
} 

Pero en cambio, lo que el compilador de CoffeeScript genera es el siguiente:

if (this.myVar != null) { 
    alert(myVar); 
} 

Si no hago referencia a esto (o cualquier otro objeto principal), CoffeeScript compila como era de esperar.

¿Es este el comportamiento correcto? Si es así, ¿por qué funciona diferente al usar esto?

Editar:

Para añadir un poco más aclaraciones. Esto no ocurre solo con esto, sino con cualquier otra propiedad de los objetos. Por ejemplo, si yo fuera sustituir el CoffeeScript anterior con lo que está debajo de ella todavía sería compilar con solamente ...

if myVar.myProp? 
    alert myVar 
+2

posible duplicado de [operador existencial y el objeto propiedades] (http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

Respuesta

14

En el caso de "! = Null":

myVar = 10 
if myVar? 
    alert myVar 

CoffeeScript compilador es capaz ver que myVar está realmente definido en la primera línea, por lo que puede omitir typeof myVar !== "undefined" verificar.

if (myVar !== null) { 
    alert(myVar); 
} 

Pero en este caso:

if myVar? 
    alert myVar 

compilador no puede garantizar que myVar que realmente está definido, por lo que se requiere verificación adicional:

if (typeof myVar !== "undefined" && myVar !== null) { 
    alert(myVar); 
} 

Por lo tanto, la respuesta es: CoffeeScript el compilador intenta ser inteligente para producir un código eficiente.

EDITAR La forma CoffeeScript trata de propiedades también es correcta: this.prop volverá undefined si la propiedad no está definida. != lo convertirá en nulo. Es por eso que no necesitamos cheques adicionales.
En pocas palabras:

  • acceso variable no definida producido una excepción - la necesidad de comprobar typeof
  • acceder propiedad no definida devuelve undefined - sólo != es suficiente
+0

Entiendo eso. Mi pregunta tenía más que ver con verificar la existencia de propiedades en objetos ... this.var, o that.var.property ... etc. omite la verificación indefinida y solo hace a! = Null en lugar de! == null .. . –

+0

Entiendo ahora. Tengo que atribuirlo a mi falta de comprensión del compilador CoffeeScript :) Realmente no sabía que era lo suficientemente inteligente como para tomar estas "decisiones". Sin embargo, eso es realmente bueno de saber. ¡Muchas gracias por la información! –