【问题标题】:How to understand "if ( obj.length === +obj.length )" Javascript condition statement?如何理解“if(obj.length === +obj.length)”Javascript条件语句?
【发布时间】:2013-11-17 11:21:29
【问题描述】:

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

obj.length === +obj.length.

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

背景

  • 我发现 underscore.js 库 (underscore.js annotated source) 的某些函数中使用了此语句。
  • 我的猜测是这个条件语句与测试变量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); //打印错误

【问题讨论】:

    标签: javascript syntax underscore.js conditional-statements


    【解决方案1】:

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

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

    【讨论】:

    • 是的,尽管在我看来typeof obj.length == 'number' 会更清楚。 :-/
    • 感谢您的快速回答。所以基本上它似乎将长度属性测试为Number。是否有更多syntactic sugar 方法可以达到相同的测试结果?我查看了isNumeric(obj.length)obj.length istanceof Number,那些看似更好的选择是假朋友。对数字进行测试有什么想法吗?
    • 好点(我在评论后想到的),但没有上下文,想要这样做的原因尚不清楚。
    • @humanityANDpeace——你对“一个数字”的定义是什么?那是-Infinity < x < +Infinity && x != NaN 吗?
    • @RobG 好问题!我不得不说,在 Javascript 的数字变量原语的概念和 Number Javascript 对象所反映的内容之间,我不得不承认我不知道我应该在这里回答什么。毕竟直觉并没有帮助,NaN 在某种程度上是一个typeof NaN === "number" // true 奇怪的东西。你能帮忙吗?
    【解决方案2】:

    它同时进行两个测试:

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

    也可以写成:

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

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

    【讨论】:

    • 感谢@some。我也喜欢你的回答。结合昆汀的回答,它完成了画面。我认为语法糖是如此冗长,并且需要 && isFinite(ob.length) 部分的陷阱清楚地说明了为什么 underscore.js 魔术师选择了一元加号运算符(除了它很混乱)。跨度>
    • 第二个测试也可以是!isNaN(obj.length)。请注意,在原版中,Infinity == +Infinity 是 true,但 isFinite(Infinity) 返回 false,所以上面的测试可能是一个更好的测试(取决于最初的意图是什么)。
    • @finishingmove 它可以是任何东西......字符串、对象、布尔值、null、未定义......或数字。仅仅因为它被称为length 并不意味着它是一个数字。
    • a = NaN 然后 +a 返回 NaNa===+a 返回 false(NaN 不等于 NaN)。而typeof a 也返回'number'。那行可能是:确保 obj.lenght 不是 NaN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多