obj.length何时不等于+ obj.length?

时间:2014-01-25 23:30:58

标签: javascript underscore.js

当我遇到这个时,我正在仔细阅读underscore.js annotated source

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

我现在从this stackoverflow question知道加号(+)运算符返回对象的数字表示。

那就是说,obj.length返回一个数字。 obj.length何时不等于+obj.length

2 个答案:

答案 0 :(得分:5)

===运算符在检查时不进行任何类型转换,因此即使'5' == 5,不同类型的数据也会立即返回false。你所说的+将对象转换为数字。如果您将数字类型转换为数字,它仍然是一个数字,因此您基本上检查object.length是否存在且是否为数字。 undefinedNaNnullstring等值将返回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 stringobj将会进入keys次迭代。