当我遇到这个时,我正在仔细阅读underscore.js annotated source:
if (obj.length === +obj.length) {...}
我现在从this stackoverflow question知道加号(+)运算符返回对象的数字表示。
那就是说,obj.length返回一个数字。 obj.length
何时不等于+obj.length
?
答案 0 :(得分:5)
===
运算符在检查时不进行任何类型转换,因此即使'5' == 5
,不同类型的数据也会立即返回false。你所说的+
将对象转换为数字。如果您将数字类型转换为数字,它仍然是一个数字,因此您基本上检查object.length
是否存在且是否为数字。 undefined
,NaN
,null
,string
等值将返回false
。你不确定obj会发生什么,所以你必须检查......
答案 1 :(得分:1)
例如:
var obj = {
0: 'first',
length: '1'
};
alert(obj.length === +obj.length);
下划线的each
是通用的,因此可以与array
以外的其他对象一起使用。就像ECMA5 forEach
forEach函数是故意通用的;它不要求它的这个值是一个Array对象。因此,它可以转移到其他类型的对象以用作方法。 forEach函数是否可以成功应用于宿主对象是依赖于实现的。
因此下划线正在检查对象的length
属性的有效性。只有当对象的arrayLike
返回的length
不是number
且肯定不是{{1}时,它们才会认为该对象NaN
对于该迭代方法}}。因此,在上面的示例中,如果没有本机/ polyfilled string
,obj
将会进入keys
次迭代。