2012-02-08 12 views

cevap

30

if (typeof obj.length == 'number') yazmanın başka bir yolu. Neden böyle yaparlarsa, bu birisinin tahminidir. Muhtemelen okunabilirlik pahasına akıllı olmaya çalışıyorum. Hangisi değil çok nadir bugünlerde maalesef ...

o yüzden minifiers (YUI Compressor, Closure Compiler, UglifyJS, vs) tarafından daha sıkıştırılabilir olamayabilir rağmen:

(a.length===+a.length) (typeof a.length=='number')

vs

Bunların yapılması, her biri 5 baytlık tasarruf sağlar. Numaraya

+0

kaydet olsa bazı perf pahasına 5 bayt (cevaplar http://jsperf.com/obj-length-vs-typeof-number – j03m

24

obj 's length özelliğinin bir numarasıdır.

unary + operator, işlenenini bir sayıya dönüştürür ve strict equality operator, sonucu, orijinal length özelliğinin tür baskısı gerçekleştirmeden karşılaştırır. Bu nedenle, obj.length gerçek bir sayıysa (örneğin, bir sayıya dönüştürülebilen bir dize) ifade yalnızca ifade true olacaktır.

2

+obj.length numarayı obj.length döndürünüz. Sanırım bu, obj.length'un bir sayı olup olmadığını test etmektir.

4

Eğer obj.length bir sayı ise test etmelerinin ana sebebi bence - Object'in nesne tipini [object Array] 'dan ayırmaktır (String ve Function nesneleriyle de çalışır). [Nesne nesnesi], uzunluk özelliğine sahip değil.

yüzden

obj = {a:1, b:2}; //obj.length = undefined 

obj.length === +obj.length 
undefined === NaN //false - you know that your obj has type Object 
// (or some other object, but not Array, !String and !Function) 
// so, you need to determine size of the obj in some way 
// or use for in loop to iterate over your obj 

Saygılarımızla

PS eğer: IMO ikinci bölümünü "niye kullanıyorsun o" sorusu

+0

teşekkürler, bu testte "else" maddesine neden ihtiyaç duyduklarını anlamama yardımcı oldu nesne anahtarları/öğe üzerinde döngü için klasik "for" yerine döngü. –

İlgili konular