如何理解“if(obj.length === + obj.length)”Javascript条件声明?

时间:2013-11-06 09:35:16

标签: javascript syntax underscore.js conditional-statements

我遇到了条件陈述,我有些难以理解。它看起来像(请注意右侧的+ - 签名):

obj.length === +obj.length

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

背景

  • 我在 underscore.js 库(underscore.js annotated source)的某些函数中发现了这个语句。
  • 我的猜测是,这个条件语句在某种程度上与测试变量obj是否为Array类型有关? (但我完全不确定)。我试图使用此代码测试它。

var myArray = [1,2,3];
testResult1 = myArray.length === +myArray.length;
console.log( testResult1 ); //prints true

var myObject = { foo : "somestring", bar : 123 };
testResult2 = myObject.length === +myObject.length;
console.log( testResult2 ); //prints false

2 个答案:

答案 0 :(得分:5)

unary plus operator+)将RHS转换为数字。

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

答案 1 :(得分:5)

它同时进行两项测试:

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

也可以写成:

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

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