2011-05-09 36 views
5

varsayım x bir nesne ...açık typeof == "undefined" sadece kendi varlığı için kontrol kontrol edin?

 if (typeof x.foo != "undefined") 

 if (x.foo) 

?

Bu blog yazısını okurken bu soru geldi: http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/

Onun örneğinde, o yapıyor:

function EventTarget(){ 
    this._listeners = {}; 
} 

EventTarget.prototype = { 

    constructor: EventTarget, 

    addListener: function(type, listener){ 
    if (typeof this._listeners[type] == "undefined"){ 
     this._listeners[type] = []; 
    } 

    this._listeners[type].push(listener); 

Bu durumda bu._listeners [tür] hiçbir zaman bir şey olmayacak bir dizi hariç - bu durumda

addListener: function(type, listener){ 
    if (!this._listeners[type]){ 
     this._listeners[type] = []; 
    } 

    this._listeners[type].push(listener); 

yapmak için daha temiz olacağını doğru değil mi?

Ayrıca, bir yan soru olarak, neden yaptığını anlamıyorum:

EventTarget.prototype = { 

    constructor: EventTarget 

Yeni EventTarget() öğesini çağırdığınızda varsayılan olarak kurucu varsayılan olarak EventTarget ('this') olarak ayarlanmadı mı? ?

+0

üçüncü alternatif bulunmaktadır: 'if (x.foo == tanımsız!)'. * Çift = * (tip zorlama olmadan eşitlik) –

+1

@Dan Uyarı: Bazı aptal 'undefined' değiştirirse o kırar rağmen. Evet, bu mümkün. – delnan

+0

@delnan Doğru ama bu bile karşı korumak için yolu vardır: '(function (tanımsız) {... tanımsız ... Burada gerçekten tanımsız}())' –

cevap

10

truthy values'a dikkat edin. x.foo

  • yanlışsa

    if (x.foo) yayınlanmaz

  • boş
  • tanımsız
  • ""
  • NaN

Neredeolarak değeri undefined

Alternatif olup olmadığını kontrol eder içinsadece denetler

if (x.foo !== undefined) { ve if (x.foo !== void 0) {

undefined yerel bir değişken

undefined = true olarak kılınabilir biçimde dikkatli olun mı olacağını geçerli bir ifadedir ve tüm kodunuzu kıracak. Tabii ki bu kodu üretimde asla göremeyeceksin, böylece gerçekten ona karşı kalkan olmanıza gerek yok, sadece dikkatli olun.

Ben şahsen

if (x.foo != null) { 
    ... 
} 

null ve undefined hem denetler çok kullanma eğilimindedir.

[[Düzenle]] o da bir Array veya undefined öylesine !foo güvenlidir var özel örnekte

. şahsen ben Kullanıcıların oldukça o zaman null veya false veya "" olduğunda tanımsız olduğunda ben sadece çalıştırmak için beklemek bilmesi açısından undefined için özel olarak kontrol etmek tercih ediyorum. Bu kod daha açık/kendini belgeleyen yapar. Yeni bir nesne ile EventTarget.prototype üzerine yazarsanız

EventTarget.prototype = { 

    constructor: EventTarget 

gelince sonra EventTarget.prototype.constructor mülkiyet kaybetti ve tekrar ayarlanması gerekir edilir.

Yalnızca prototipi EventTarget.prototype.method = ... numaralı telefonu arayarak uzatırsanız, .constructor yeniden ayarlamanız gerekmez.

+0

ne yazdığını yanıt vermek sorumu güncellenen ... – patrick

+0

@patrick hitap edin. – Raynos

+0

anladım .. Bilgi için çok teşekkürler! – patrick

İlgili konular