2012-02-08 4 views

risposta

30

È un altro modo di scrivere if (typeof obj.length == 'number'). Perché lo fanno in quel modo, è la supposizione di chiunque. Probabilmente sta cercando di essere intelligente a scapito della leggibilità. Che non è troppo raro di questi tempi, purtroppo ...

Anche se potrebbe essere in modo che possa essere compresso più da minifiers (YUI Compressor, Closure Compiler, UglifyJS, etc.):

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

Facendo in modo che salverebbe 5 byte, ogni istanza.

+0

Salva 5 byte a scapito di qualche perf però (in chrome comunque) http://jsperf.com/obj-length-vs-typeof-number – j03m

24

Questo test se la proprietà objlength è un numero.

Il unary + operator converte il suo operando in un numero e strict equality operator confronta il risultato con la proprietà originale length senza eseguire la coercizione di tipo.

Pertanto, l'espressione sarà solo true se obj.length è un numero effettivo (non ad esempio una stringa che può essere convertita in un numero).

2

+obj.length trasformare obj.length in numero. Penso che questo sia per verificare se obj.length è un numero.

4

Penso che il motivo principale per cui stanno verificando se obj.length sia un numero - è di differenziare il tipo di oggetto Object da [object Array] (funzionerebbe anche con oggetti String e Function). L'oggetto [oggetto] non ha proprietà di lunghezza.

quindi se

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 

riguarda

PS: IMO risponde la seconda parte del "Perché lo usano" questione

+0

grazie, mi ha aiutato a capire perché avevano bisogno della clausola "else" su questo test (che usa un "per ... in" loop invece di un classico "for" per eseguire il loop su chiavi/oggetto dell'oggetto). –