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)?
This is a common point of confusion with the existential operator: Sometimes
compiles to
and other times it just compiles to
The two are equivalent, because
x != nullwill befalsewhenxis eithernullorundefined. Sox != nullis a more compact way of expressing(x !== undefined && x !== null). The reason thetypeofcompilation occurs is that the compiler thinksxmay not have been defined at all, in which case doing an equality test would triggerReferenceError: x is not defined.In your particular case,
test.testmay have the valueundefined, but you can't get aReferenceErrorby referring to an undefined property on an existing object, so the compiler opts for the shorter output.