【问题标题】:Javascript idiom: What does if (x === +x) do? [duplicate]Javascript 成语: if (x === +x) 做什么? [复制]
【发布时间】:2013-01-30 12:42:31
【问题描述】:

通读underscore.js的源代码,偶然发现了following line

... if (obj.length === +obj.length) { ...

这让我有点困惑。这里实际比较的是什么?我相信它与检测原生数组有关,但无法弄清楚实际发生了什么。 + 有什么作用?为什么使用=== 而不是==?这种风格的性能优势是什么?

【问题讨论】:

    标签: javascript arrays idioms triple-equals


    【解决方案1】:

    + 将值强制转换为数字(很像 !! 将其强制转换为布尔值)。

    if (x === +x)
    

    ...可用于确认x 本身包含一个整数值。在这种情况下,可能需要确保 obj 的长度属性是一个整数并且没有被字符串值覆盖,因为如果将 obj 视为一个数组,这可能会破坏迭代。

    【讨论】:

    • JavaScript 中没有整数。
    • +'5.5'5.5,您正在寻找号码。 (&@Salman,整数将在 ES6 中引入)
    • 准确地说,+parseFloat 的快捷方式,而不是parseInt 的快捷方式。所以它强制值浮动(或 "Number" 类型)。
    【解决方案2】:

    检查 obj.length 是否为 Number 是一种愚蠢的 (IMO) 方式。这样更好:

    typeof obj.length == "number"
    

    【讨论】:

    • 为什么这么傻?首选的替代方案是什么?
    • 我不认为这很愚蠢。也许它甚至比typeof 方式更快。
    • 懒惰?是的..傻吗?不... Number(obj.length)还有很多要输入的内容;)
    • @SalmanA 好吧,this wonderful discovery 也是如此。
    • 我其实对表现感到惊讶:jsperf.com/expr-expr-vs-typeof-expr
    【解决方案3】:

    + 将右边的内容结合为数字。

    在这种情况下,如果长度不是对象 undefined 的属性,则会返回。 + undefined 将产生 Nan 并且这个评估是错误的。

    如果字符串可以结合成一个数字,那么它将是..例如+ '1' 将产生1 作为Number 这在处理字符串形式的十六进制值时尤其重要,例如+'0x7070' 产生28784

    【讨论】:

    • 有趣。我猜+"everthing but a number"的值也是NaN
    • 更新了我的答案以澄清!如果您还需要什么,请告诉我!
    猜你喜欢
    • 2015-07-04
    • 2011-05-04
    • 2013-08-17
    • 2018-05-07
    • 2016-05-16
    • 1970-01-01
    • 2015-06-17
    • 2023-03-04
    • 2013-08-29
    相关资源
    最近更新 更多