2013-06-14 16 views
5

Şu an için Javascript'i programlıyorum ve hala çok tembel olmama veya olmadığımdan emin değilim. bazen sadece çok ayrıntılı olur, ancakBir değişkenin bir nesne olduğundan emin olun

if(typeof(something) === 'undefined'){ 
    // .. 
} 

: Ben bir sürü var. Örneğin, şimdi yapıyorum:

aşağıdaki satırlarda ben bir nesne olarak redirectURLs olayları ele aldığım o (işlev de undefined döndürebilir) Tüm tanımlanmış olabilir rağmen, var
var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success') || {}; 

.

"En iyi uygulama" hile sayfası var mı? Yukarıda yazdıklarım çok tembel mi?

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if(typeof(redirectURLs) === 'undefined'){ 
    redirectURLs = {} 
} 

Ben kısayol az sağlam olduğunu biliyoruz, ama sonra tekrar, insanlar ya bu değeri, ya da olacak: Alternatif hantal oluşu.

Fikirler?

Merc.

+1

Ben 'NS.isDefined eklemek eğilimindedir (test_var, [default_if_not_defined])' yardımcı işlevi –

cevap

0

size "kısayol" seçeneğini kullanarak, yani şu eşdeğerdir:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if (!redirectURLs) redirectURLs = {}; 

şartname (ECMA-262) devletler olsun mantıksal VEYA operatörü (||) testleri ilk ifade (bu durumda, işlev çağrısı) doğruya doğru zorlar ya da değil - eğer doğruyu zorlarsa, ilk ifadeyi döndürürse, diğerini döndürürse.

Ayrıca doğru ve yanlış olarak coerces Ne devletler (§9.2 - not bu aynen verilmediğini):

Yanlış:

  • numaraları 0, -0, ve NaN
  • boş dize ("")
  • false
  • Gerçek 10
  • null
  • undefined

: (new Boolean(false) gibi şeylerle dahil) başka şeyi

Yani, çoğu numaraları, dizeleri veya içinden değeri true izin sakıncası yoksa, sonra mantıksal VEYA "kısayol" Tamam olur. redirectURLs boş olup olmadığını "ayrıntılı" kod bozabilir unutmayın:

var redirectURLs = null; 
if (typeof redirectURLs === 'undefined') { 
    redirectURLs = {}; 
} 
redirectURLs.test = '1'; // TypeError: Cannot set property 'test' of null 
0

Her zaman harici bir API'den nesnelerle ilgilenmek istiyorsanız (hotplate kitaplığı üzerinde denetiminiz bulunmadığını varsayalım), her bir işlev çağrısını bir nesneye yayınlamak için kullanabilirsiniz. bir operatör (parantez gerek) Eğer değişkenin varlığı için kontrol etmektir typeof ile

function getHotplateUri(uri){ 
    // Probably good to validate the URI format 
    var redirectURLs = hotplate.get(uri); 
    if(typeof(redirectURLs) === 'undefined'){ 
     redirectURLs = {} 
    } 
    return redirectURLs 
} 
+0

sarıcı öneri Tamam, ama bunun dışında Bu koda hiç katılmıyorum, çok kötü kokulu. Neden "uri" yi doğrulamayı önerirsin? Neden "ocak" bir bağımlılık değil? – Halcyon

+0

Niçin URI'yi doğrulayın: sarıcıdaki herhangi bir tüketici için hızlıca başarısız olmak. Sıcak plaka neden bir bağımlılık değildir: kararlaştırılmış, durum böyle olmalıdır. – Sparko

0

. Kısa devre operatörü ||, değişkenin zaten mevcut olduğunu (beyan edildiğini) varsayar ve değerinin falsi olup olmadığını kontrol eder (tanımlanmamış, boş, boş dize, sıfır ...).

Bu durumda, typeof kullanarak durumunuzda, zaten var olan hotplate nesnesinin bir yönteminin döndürülen değerini test ettiğiniz için gereksizdir. Dediğin gibi: undefined (tip "undefined" ait) önceden tanımlanmış bir değer olmasa

... işlevi de,

"undefined"undefined türüdür döndürebilir. Atama gerçekleşinceye kadar kaldırıldıklarında değişkenlere atanır. Atama yoksa değişken bildirilir ancak undefined değeri vardır. Ayrıca hiçbir şey iade etmeyen işlevler undefined.

Yani typeof undefined === 'undefined' // true

+0

Yani kısayol kodu aslında% 100 Tamam ... – Merc

+0

Senin durumunda evet diyeyim. – elclanrs

+0

Burada kestirme, neden vb. Kullanmanın iyi olduğunu açıklayan hoş, "kabul edilen" bir belge var mı? – Merc

İlgili konular