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

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • BruBearBaby

    BruBearBaby

    25 Ocak 2011
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012