2012-04-03 2 views
11

Я заметил кое-что немного странное с компилятором 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, как и следовало ожидать.

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

Edit:

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

if myVar.myProp? 
    alert myVar 
+2

возможно дубликат [экзистенциального оператора и объекта свойства] (http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

ответ

14

В случае «! = NULL»:

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 если свойство не определено. != преобразует его в null. Вот почему нам не нужна дополнительная проверка.
В нескольких словах:

  • доступ к неопределенной переменной кидает исключение - надо проверить typeof
  • доступа неопределенное свойство возвращает undefined - просто != достаточно
+0

Я понимаю это. Мой вопрос больше связан с проверкой наличия свойств на объектах .. this.var или that.var.property .. и т. Д. Он опускает неопределенный чек и только имеет значение! = Null вместо! == null .. , –

+0

Я понимаю сейчас. Я должен объяснить это недостаточным пониманием компилятора CoffeeScript :) Я действительно не знал, что он достаточно умен, чтобы принимать эти «решения». Это действительно хорошо знать. Большое спасибо за понимание! –

Смежные вопросы