javascript - 如何理解 "if ( obj.length === +obj.length )"Javascript条件语句?

标签 javascript syntax underscore.js conditional-statements

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

obj.length === +obj.length

这个条件和它的目的/语法能解释一下吗?
查看该声明(在不知情的情况下)会让人觉得它是某种肮脏的 hack,但我几乎可以肯定 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

最佳答案

它同时进行两个测试:

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

也可以写成:

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

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

关于javascript - 如何理解 "if ( obj.length === +obj.length )"Javascript条件语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19808408/

相关文章:

javascript - 在 Javascript 中非破坏性地反转数组

javascript - Angular 未捕获对象

backbone.js - underscore.js 模板中的每个循环

javascript - 过滤导致显示的数据过多

javascript - 将数组缩减为单个字符串

java - 从jsp向Javascript传递参数

javascript - 中继操作名称是什么?

c++ - 为类模板的单个成员定义特化

不同 .c 文件之间公共(public)变量的 c 语法错误

ruby-on-rails - Ruby 和 Cucumber - 这是什么意思? "([^"]*)"$/