2012-04-03 34 views
11

CoffeeScript bileşeniyle biraz garip bir şey fark ettim ve bunun doğru bir davranış olup olmadığını merak ettim. Doğru ise bir fark var neden merak ediyorum ..CoffeeScript Varolan Operatör ve bu

aşağıdaki CoffeeScript Verilen:

if @myVar? 
    alert myVar 

böyle JavaScript derlemek için bekliyordum:

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

Ama bunun yerine CoffeeScript derleyici çıktıları şu şekildedir: Bu referansı kullanmıyorsam (veya başka bir ana nesne), CoffeeScript beklediğim gibi derler.

Bu doğru davranış mı? Eğer öyleyse, bunu kullanırken neden farklı çalışır?

Düzenleme:

biraz daha fazla açıklama eklemek için. Bu sadece bununla değil, nesnelerin diğer özellikleriyle gerçekleşmez. yapabiliyor

myVar = 10 
if myVar? 
    alert myVar 

CoffeeScript derleyici: "= null" Mesela ben sanki durumunda ... hala sadece birlikte derlemek ediyorum

if myVar.myProp? 
    alert myVar 
+2

olası yinelenen özellikleri] (http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

cevap

14

bunun altında ne yukarıda CoffeeScript yerine myVar'un gerçekten ilk satırda tanımlandığını görmek için typeof myVar !== "undefined" kontrolünü atlayabilirsiniz.

if myVar? 
    alert myVar 

derleyici aslında tanımlanır myVar, bu yüzden ekstra onay gerekli olduğunu garanti edemez:

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

Yani, cevap:

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

Ancak bu durumda

CoffeeScript derleyici verimli kod üretmek için akıllı olmaya çalışır.

DÜZENLEME özelliklere sahip CoffeeScript fırsatlar da doğrudur yolu: özellik tanımlı değilse this.propundefined dönecektir. !=, onu null değerine dönüştürecektir. Bu yüzden ek kontrole ihtiyacımız yok. Birkaç kelime
: - tanımsız bir özelliğe erişme typeof

  • undefined döner kontrol etme ihtiyacı -

    • tanımsız bir değişkene erişmeye istisna atar sadece != yeterlidir
    [Varoluşsal operatör ve nesnenin
  • +0

    Bunu anlıyorum. Benim sorum nesneler üzerinde özelliklerin varlığını kontrol ile daha fazla şey vardı .. this.var, ya da that.var.property .. vb .. undefined çek yerine ve sadece bir! = Null yerine! == null .. . –

    +0

    Şimdi anlıyorum. Bunu, CoffeeScript derleyicisinin anlaşılmasındaki eksikliğime kadar yazmalıyım :) Gerçekten bu "kararları" vermek için yeterince akıllı olduğunu bilmiyordum. Gerçi bilmek gerçekten çok güzel. Anlayış için çok teşekkür ederim! –