(obj.length === + obj.length)比较什么?

luk*_*nis 3 javascript underscore.js

我一直在阅读underscore.js源代码并注意到这个比较_.each():

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

我知道在变量转换为数字/整数之前+.所以在这个原因

[1,2,3].length === +[1,2,3].length
Run Code Online (Sandbox Code Playgroud)

是真的.如果我传入一个对象:

var obj = {a: 1, b: 2, c: 3};
Run Code Online (Sandbox Code Playgroud)

+obj.length产生NaN

在最后一种情况下,我有

[1,2,3, {a: [4,5,6]}].length
Run Code Online (Sandbox Code Playgroud)

这是4.把它铸成一个数字..仍然是4.

else的情况决定,我可以看到这种比较可能是为了区分数组和对象,就像它使用的其他情况一样:

  for (var key in obj) { ...
Run Code Online (Sandbox Code Playgroud)

我没有看到任何理由使用这种比较.谁能解释一下?

T.J*_*der 6

基本上,这是测试的类型的方法length属性Number,而不使用typeof 这个号码是不是NaN.所以实际上:

if (typeof obj.length === "number" && !isNaN(obj.length))
Run Code Online (Sandbox Code Playgroud)

比较n === +n只对数字有效,因为===测试类型和值,+n并将创建Number(可能,如您所见,数字NaN).而且因为NaN === NaN它是错误的,它也会把它们除掉.

因此,它是一种检测方法,根据一个定义("具有数字length不是NaN"),以迭代的对象是否是阵列- .JavaScript和浏览器世界中有几个类似数组的东西,比如arguments伪数组和DOM的NodeList.


愚蠢的表现比较:

Upshot:没有NaN方面,typeof速度更快(当类型错误时显然如此).使用NaN方面,+结果将会更快,true因为它会更快,因为它是错误的类型NaN,结果将更慢(显然是这样)false.(当然,歌剧与往常不同.)

并不是说它在现实世界中很重要(见上文"愚蠢").

  • 更准确地说,它测试`length`是否为数字,而不是NaN.他们也可以为此使用'isFinite`. (2认同)