I noticed something a little odd with the CoffeeScript compilier and was wondering if this was correct behavior or not. If it is correct I'm curious why there is a difference..
Given the following CoffeeScript:
if @myVar?
alert myVar
I was expecting it to compile to JavaScript like this:
if (typeof this.myVar !== "undefined" && this.myVar !== null) {
alert(myVar);
}
But instead what the CoffeeScript compiler outputs is this:
if (this.myVar != null) {
alert(myVar);
}
If I don't reference this (or any other parent object), the CoffeeScript compiles as I would expect.
Is this the correct behavior? If so, why does it work different when using this?
Edit:
To add a little more clarification. This doesn't happen with only this, but any other properties of objects. For instance, if I were replace the above CoffeeScript with what's below it still would compile with only "!= null"...
if myVar.myProp?
alert myVar
CoffeeScript is a programming language that compiles to JavaScript. It adds syntactic sugar inspired by Ruby, Python, and Haskell in an effort to enhance JavaScript's brevity and readability. Specific additional features include list comprehension and destructuring assignment.
As of today, January 2020, CoffeeScript is completely dead on the market (though the GitHub repository is still kind of alive).
In general, we use parenthesis while declaring the function, calling it, and also to separate the code blocks to avoid ambiguity. In CoffeeScript, there is no need to use parentheses, and while creating functions, we use an arrow mark (->) instead of parentheses as shown below.
In the case of:
myVar = 10
if myVar?
alert myVar
Coffeescript compiler is able to see that myVar
is really defined in the first line, so it can omit typeof myVar !== "undefined"
check.
if (myVar !== null) {
alert(myVar);
}
But in this case:
if myVar?
alert myVar
compiler can't guarantee that myVar
is actually defined, so extra check is required:
if (typeof myVar !== "undefined" && myVar !== null) {
alert(myVar);
}
So, the answer is: Coffeescript compiler tries to be smart to produce efficient code.
EDIT
The way Coffeescript deals with properties is also correct: this.prop
will return undefined
if property is not defined. !=
will convert it to null. That is why we don't need additional check.
In few words:
typeof
undefined
-- just !=
is enoughIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With