Nella sorgente underscore.js in molti luoghi mi sono imbattuto inobj.length === + obj.length in javascript
if (obj.length === +obj.length)
Qualcuno può spiegare, perchè lo usano?
Nella sorgente underscore.js in molti luoghi mi sono imbattuto inobj.length === + obj.length in javascript
if (obj.length === +obj.length)
Qualcuno può spiegare, perchè lo usano?
È 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.
Questo test se la proprietà obj
length
è 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).
+obj.length
trasformare obj.length
in numero. Penso che questo sia per verificare se obj.length
è un numero.
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
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). –
Salva 5 byte a scapito di qualche perf però (in chrome comunque) http://jsperf.com/obj-length-vs-typeof-number – j03m