在我遇到的许多地方的underscore.js来源
if (obj.length === +obj.length)
有人可以解释,他们为什么要使用它?
答案 0 :(得分:31)
这是写if (typeof obj.length == 'number')
的另一种方式。为什么他们这样做,这是任何人的猜测。可能试图以牺牲可读性为代价来聪明。不幸的是,这一天并不常见......
虽然它可能会被缩小器(YUI Compressor,Closure Compiler,UglifyJS等)压缩得更多:
(a.length===+a.length)
vs
(typeof a.length=='number')
按照自己的方式进行操作可以节省5个字节,每个实例。
答案 1 :(得分:25)
此测试obj
的{{1}}属性是否为数字。
unary +
operator将其操作数转换为数字,strict equality operator将结果与原始length
属性进行比较,而不执行类型强制。
因此,如果length
是实际数字(不是例如可以转换为数字的字符串),则表达式将仅为true
。
答案 2 :(得分:4)
我认为,如果obj.length是一个数字,他们测试的主要原因是将Object的obj类型与[object Array]区分开来(它也适用于String和Function对象)。 [object Object]没有length属性。
所以,如果
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
问候
P.S。:IMO它回答了&#34的第二部分;他们为什么要使用它"问题
答案 3 :(得分:2)
+obj.length
将obj.length
转为数字。
我认为这是为了测试obj.length
是否为数字。