SORU
24 AĞUSTOS 2011, ÇARŞAMBA


JavaScript nesne algılama: sözdizimi karşı '' anahtar nokta

Bir UA belirli JS özelliğini uygular olup olmadığını belirlemek için iki yol gördüm: if(object.property) if('property' in object).

Hangisi daha iyi olur fikirlerini duymak isterim, ve en önemlisi, neden. Biri diğerinden daha su götürmez bir şekilde daha mı iyi? Daha fazla nesne özelliği tespiti yapmak için sadece bu iki yolu vardır? Tarayıcı desteği, tuzaklar, yürütme hızı, ve gibi, estetik yerine kapak lütfen.

Düzenleme:Okuyucular jsperf.com/object-detection testi yapmak için teşvik edilir

CEVAP
24 AĞUSTOS 2011, ÇARŞAMBA


  • if(object.property)

    başarısız durumlarda ayarlı değil (ne istiyorsun) ve davalar ayarlanmış bazı false değeri, örneğin undefined, null, 0 vb (ne istiyorsun).

    var object = {property: 0};
    if(object.property) { ... } // will not run
    
  • if('property' in object)

    aslında bir nesne, özellik, değer bakmıyorum olup olmadığını döndürür beri biraz daha iyi.

    var object = {property: 0};
    if('property' in object) { ... } // will run
    if('toString' in object) { ... } // will also run; from prototype
    
  • if(object.hasOwnProperty('property'))

    seni örnek özellikleri ve prototip özellikleri birbirinden ayırmak için izin verir bu yana daha iyi.

    var object = {property: 0};
    if(object.hasOwnProperty('property')) { ... } // will run
    if(object.hasOwnProperty('toString')) { ... } // will not run
    

Performans zaman binlerce ikinci bir kontrol ettiğin sürece bir sorun o kadar büyük değil burada derdim ama bu durumda başka bir kod yapısı göz önünde bulundurmalısınız. /Sözdizimi yeni tarayıcılar tarafından desteklenmektedir, hasOwnProperty etrafında uzun bir süre oldu.


Düzenleme:Ayrıca genel bir fonksiyon bir şey (olmayan şeyleri bile nesneler) geçerek bir mal varlığını denetlemek için bu gibi bir nesne olarak yapabilirsiniz:

function has(obj, prop) {
    return Object.prototype.hasOwnProperty.call(obj, prop);
}

Şimdi bu gibi çalışır:

has(window, 'setTimeout'); // true

window.hasOwnProperty === undefined IE sürüm 8 veya daha düşük olan) bile.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • Dave Wallace

    Dave Wallace

    27 Kasım 2007
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011