2012-04-03 15 views
11

Zauważyłem coś dziwnego z kompilatorem CoffeeScript i zastanawiałem się, czy to było prawidłowe zachowanie czy nie. Jeśli prawdą jest, że jestem ciekaw, dlaczego istnieje różnica ..CoffeeScript Existential Operator i ten

Biorąc pod następującym coffeescript:

if @myVar? 
    alert myVar 

Spodziewałem się go skompilować do JavaScriptu tak:

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

Ale zamiast tego, co wypisuje kompilator CoffeeScript:

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

Jeśli nie odwołuję się do tego (lub jakikolwiek inny obiekt nadrzędny), CoffeeScript kompiluje się tak, jak bym się spodziewał.

Czy to jest prawidłowe zachowanie? Jeśli tak, dlaczego działa to inaczej podczas korzystania z tego?

Edit:

Aby dodać trochę więcej wyjaśnień. Nie dzieje się tak tylko z tą, ale innymi właściwościami obiektów. Na przykład, jeśli miałbym wymienić powyżej coffeescript z tym, co pod nią nadal będzie skompilować tylko ...

if myVar.myProp? 
    alert myVar 
+2

możliwe duplikat [egzystencjalnej podmiotu i przedmiotu właściwości] (http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

Odpowiedz

14

W przypadku „! = Null”:

myVar = 10 
if myVar? 
    alert myVar 

coffeescript kompilator jest w stanie aby zobaczyć, że myVar jest naprawdę zdefiniowany w pierwszym wierszu, więc może pominąć sprawdzanie typeof myVar !== "undefined".

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

Ale w tym przypadku:

if myVar? 
    alert myVar 

kompilator nie może zagwarantować, że myVar jest właściwie zdefiniowane, więc wymagana jest dodatkowa kontrola:

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

Więc odpowiedź brzmi: coffeescript kompilator stara się być inteligentny, aby stworzyć wydajny kod.

EDIT Sposób oferty coffeescript o właściwościach jest również poprawna: this.prop powróci undefined jeżeli nieruchomość nie jest zdefiniowana. != przekonwertuje go na wartość null. Dlatego nie potrzebujemy dodatkowej kontroli.
W kilku słowach:

  • dostępu do niezdefiniowanej zmiennej rzuca wyjątkiem - konieczność sprawdzenia typeof
  • dostępu do niezdefiniowanej właściwości zwraca undefined - tylko != wystarczy
+0

Rozumiem to. Moje pytanie miało więcej wspólnego z sprawdzaniem istnienia właściwości na obiektach .. this.var, lub that.var.property .. etc .. pomija niezdefiniowane zaznaczenie i robi tylko! = Null zamiast! == null .. . –

+0

Teraz rozumiem. Muszę to skrytykować do mojego niezrozumienia kompilatora CoffeeScript :) Naprawdę nie wiedziałem, że jest wystarczająco inteligentny, aby podejmować te "decyzje". Jednak dobrze to wiedzieć. Dziękuję bardzo za wgląd! –