coffeescriptexistential-operator

How do I use the CoffeeScript existential operator to check some object properties for undefined?


I would like to use the CoffeeScript existential operator to check some object properties for undefined. However, I encountered a little problem.

Code like this:

console.log test if test?

Compiles to:

if (typeof test !== "undefined" && test !== null) console.log(test);

Which is the behavior I would like to see. However, when I try using it against object properties, like this:

console.log test.test if test.test?

I get something like that:

if (test.test != null) console.log(test.test);

Which desn't look like a check against undefined at all. The only way I could have achieved the same (1:1) behavior as using it for objects was by using a larger check:

console.log test.test if typeof test.test != "undefined" and test.test != null

The question is - am I doing something wrong? Or is the compiled code what is enough to check for existence of a property (a null check with type conversion)?


Solution

  • This is a common point of confusion with the existential operator: Sometimes

    x?
    

    compiles to

    typeof test !== "undefined" && test !== null
    

    and other times it just compiles to

    x != null
    

    The two are equivalent, because x != null will be false when x is either null or undefined. So x != null is a more compact way of expressing (x !== undefined && x !== null). The reason the typeof compilation occurs is that the compiler thinks x may not have been defined at all, in which case doing an equality test would trigger ReferenceError: x is not defined.

    In your particular case, test.test may have the value undefined, but you can't get a ReferenceError by referring to an undefined property on an existing object, so the compiler opts for the shorter output.