CoffeeScript экзистенциальный оператор и это - PullRequest
11 голосов
/ 03 апреля 2012

Я заметил кое-что странное с компилятором 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

1 Ответ

14 голосов
/ 03 апреля 2012

В случае:

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 старается быть умным для создания эффективного кода.

EDIT То, как Coffeescript обрабатывает свойства, также является правильным: this.prop вернет undefined, если свойство не определено.!= преобразует его в ноль.Вот почему мы не нуждаемся в дополнительной проверке.
В двух словах:

  • доступ к неопределенному исключению бросков переменной - нужно проверить typeof
  • доступ к неопределенному возврату свойстваundefined - достаточно != достаточно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...