javascript中的obj.length === + obj.length

时间:2012-02-08 06:57:12

标签: javascript underscore.js

在我遇到的许多地方的underscore.js来源

if (obj.length === +obj.length)

有人可以解释,他们为什么要使用它?

4 个答案:

答案 0 :(得分:31)

这是写if (typeof obj.length == 'number')的另一种方式。为什么他们这样做,这是任何人的猜测。可能试图以牺牲可读性为代价来聪明。不幸的是,这一天并不常见......

虽然它可能会被缩小器(YUI CompressorClosure CompilerUglifyJS等)压缩得更多:

(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.lengthobj.length转为数字。 我认为这是为了测试obj.length是否为数字。