5

我遇到了一个我很难理解的条件语句。它看起来像(请注意+右侧的 -符号):

obj.length === +obj.length.

可以解释这种情况及其目的/语法吗?
看这个声明(不知道它)会让人觉得它是某种肮脏的 hack,但我几乎可以肯定underscore.js是一个设计良好的库,所以必须有更好的解释。

背景

  • 我发现在underscore.js库的一些函数中使用了这个语句( underscore.js 带注释的源代码)。
  • 我的猜测是这个条件语句在某种程度上与测试一个变量obj是否为数组类型有关?(但我完全不确定)。我尝试使用此代码对此进行测试。
var myArray = [1,2,3];
testResult1 = myArray.length === +myArray.length;
控制台.log(testResult1); //打印为真

var myObject = { foo : "somestring", bar : 123 };
testResult2 = myObject.length === +myObject.length;
控制台.log(testResult2); //打印错误

4

2 回答 2

5

它同时进行两项测试:

  • 确保 obj.length 是一个数字
  • 确保 obj.length 不是 NaN(不是数字)

也可以写成:

(typeof obj.length === 'number') && !isNaN(obj.length)

更新的答案:我首先说它等同于typeof obj.length === 'number') && isFinite(obj.length)但它不是,因为它返回 true for +Infinityand -Infinity。感谢 RobG 指出这一点

于 2013-11-06T09:49:24.333 回答
5

元加号运算符( +) 将 RHS 转换为数字。

这是一个测试,首先查看该值是否为数字。

于 2013-11-06T09:37:31.603 回答