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

dor*_*emi 6 javascript underscore.js

当我遇到这个时,我正在仔细阅读underscore.js注释源:

if (obj.length === +obj.length) {...}
Run Code Online (Sandbox Code Playgroud)

我现在从这个stackoverflow问题知道加号(+)运算符返回对象的数字表示.

也就是说,obj.length返回一个数字.什么时候obj.length不等于+obj.length

Θεό*_*δης 5

===运营商不作任何类型转换时,它会检查,所以不同类型的数据会立即返回false就算'5' == 5.在+如你所说的类型转换对象成数.如果你将一个数字类型化为一个数字,它仍然是一个数字,所以你基本上检查你的object.length存在是否是一个数字.像价值观undefined,NaN,null,string和其他人将返回false.你不确定obj会发生什么,所以你必须检查......


Xot*_*750 1

当,例如:

var obj = {
    0: 'first',
    length: '1'
};

alert(obj.length === +obj.length);
Run Code Online (Sandbox Code Playgroud)

Underscoreeach是通用的,因此可以与array. 就像ECMA5一样forEach

forEach 函数故意是通用的;它不要求其 this 值是一个 Array 对象。因此它可以转移到其他类型的对象以用作方法。forEach 函数是否可以成功应用于宿主对象取决于实现。

所以下划线正在检查对象length属性的有效性。arrayLike对于该迭代方法,只有当该对象length返回的 anumber不是NaN且肯定不是 a 时,他们才认为是一个对象string。所以在我上面的例子中,如果没有 native/polyfilled ,obj就会陷入迭代。keysforEach