CoffeeScript экзистенциальный оператор и это

Я заметил кое-что странное в компиляторе CoffeeScript и подумал, правильное ли это поведение или нет. Если это правильно, мне любопытно, почему есть разница ..

Учитывая следующий CoffeeScript:

if @myVar?
  alert myVar

Я ожидал, что он скомпилируется в JavaScript следующим образом:

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

Но вместо этого то, что выводит компилятор CoffeeScript, таково:

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

Если я не ссылаюсь на этот (или любой другой родительский объект), CoffeeScript компилируется, как я и ожидал.

Это правильное поведение? Если так, почему это работает по-другому при использовании этого?

Редактировать:

Чтобы добавить немного больше разъяснений. Это происходит не только с этим, но и с любыми другими свойствами объектов. Например, если бы я заменил вышеуказанный CoffeeScript на то, что ниже, он все равно скомпилировался бы только с "! = Null" ...

if myVar.myProp?
  alert myVar
 mu is too short03 апр. 2012 г., 16:38

Ответы на вопрос(1)

Решение Вопроса

На случай, если:

myVar = 10
if myVar?
  alert myVar

Компилятор Coffeescript способен увидеть, чтоmyVar действительно определено в первой строке, поэтому его можно опуститьtypeof myVar !== "undefined" проверить.

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

Но в этом случае:

if myVar?
  alert myVar

компилятор не может гарантировать, чтоmyVar фактически определено, поэтому требуется дополнительная проверка:

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

Итак, ответ таков: компилятор Coffeescript старается быть умным, чтобы создавать эффективный код.

РЕДАКТИРОВАТЬ То, как Coffeescript работает со свойствами, также правильно:this.prop вернусьundefined если свойство не определено.!= преобразует его в ноль. Вот почему нам не нужна дополнительная проверка.
В двух словах:

доступ к неопределенной переменной бросает исключение - нужно проверитьtypeofдоступ к неопределенным возвратам свойствundefined -- только что!= достаточно
 Jason L.03 апр. 2012 г., 14:44
Теперь я понимаю. Я должен сказать, что это из-за моего непонимания компилятора CoffeeScript :) Я действительно не знал, что он достаточно умен, чтобы принимать эти «решения». Это действительно приятно знать, хотя. Большое спасибо за понимание!
 Jason L.03 апр. 2012 г., 14:14
Я это понимаю. Мой вопрос был больше связан с проверкой существования свойств на объектах .. this.var или that.var.property .. и т.д .. он пропускает неопределенную проверку и выполняет только! = Null вместо! == null .. ,

Ваш ответ на вопрос