In underscore.js source in many places I came across
if (obj.length === +obj.length)
Can someone explain, why do they use it?
In underscore.js source in many places I came across
if (obj.length === +obj.length)
Can someone explain, why do they use it?
This tests if
obj
'slength
property is a number.The unary
+
operator converts its operand to a number, and the strict equality operator compares the result with the originallength
property without performing type coercion.Therefore, the expression will only be
true
ifobj.length
is an actual number (not e.g. a string that can be converted to a number).It's another way of writing
if (typeof obj.length == 'number')
. Why they do it that way, it's anyone's guess. Probably trying to be clever at the expense of readability. Which is not too uncommon these days, unfortunately...Although it might be so that it can be compressed more by minifiers (YUI Compressor, Closure Compiler, UglifyJS, etc):
(a.length===+a.length)
vs(typeof a.length=='number')
Doing it their way would save 5 bytes, each instance.
I think the main reason they are testing if obj.length is a number - is to differentiate obj type of Object from [object Array] (it would work also with String and Function objects). The [object Object] has no length property.
so if
regards
P.S.: IMO it answers the second part of the "why do they use it" question
+obj.length
turnobj.length
to number. I think this is to test whetherobj.length
is a number.