【问题标题】:+ operator vs parseFloat+ 运算符与 parseFloat
【发布时间】:2016-01-28 10:49:13
【问题描述】:

淘汰扩展器页面的Example 1 描述了一种四舍五入用户输入并确保它只是数字的方法。

效果很好,但是通过查看源代码,他们做了一件我不明白的奇怪事情,那就是在第 8 行,他们这样做了:

parseFloat(+newValue)

newValue 是一个字符串。

当我最初问这个问题时,我不知道 + 做了什么 - 一些进一步的 pokinglink to a different MDN page 从我得到的最初答案之一表明它是一个一元运算符,相当于 number(str)+strparseFloat(str) 之间存在一些差异(以字母字符结尾的字符串的处理和十六进制的解释似乎是头条新闻)。

我仍然不明白为什么在这种情况下需要将 + 包装在 parseFloat 中,尽管我开始认为这可能是一个错字...

【问题讨论】:

  • 我刚刚发现这个stackoverflow.com/questions/12227594/… 问题很相似——回答者对 parseFloat 和 + 之间差异的解释非常好。但它仍然没有解释为什么要在之后解析数字......
  • 两者都用是没有意义的。对号码调用 parseFloat 是一种反模式。
  • 你能把你的问题限制在#2吗?
  • 谢谢Bergi - 我认为我也没有任何意义......
  • 有问题的行似乎等同于+newValue || 0

标签: javascript


【解决方案1】:

引用 parseFloat 的 MDN 文档:

parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字 (0-9)、小数点或指数以外的字符,它将返回到该点的值并忽略该字符和所有后续字符。允许使用前导和尾随空格。

使用 [unary plus operator][2] 您可以确定 `parseFloat` 对 `Number` 进行操作,这仅在您希望对结果更严格但仍想使用 `parseFloat` 时才有用
parseFloat('0.32abcd') // -> 0.32
parseFloat(+'0.32abcd') // -> NaN
罢工> **更新:**

在对文档进行了一些挖掘并运行了一些测试之后,似乎没有理由使用parseFloat,除了解析可能包含非数字轨迹的数字的字符串,eq:

parseFloat('31.5 miles') // -> 31.5
parseFloat('12.75em') // -> 12.75

对于您的字符串包含数字+ 的任何其他情况,这是最快和首选的方式(引用MDN docs for unary plus operator):

一元加法是将某物转换为数字的最快和首选方法,因为它不对数字执行任何其他操作。

查看parseFloat versus unary test case 了解它的速度有多快。

先前的链接已损坏,因此 here is the new test 显示一元的速度更快。

【讨论】:

  • 当然可以,但为什么parseFloat(+'0.32abcd')+'0.32abcd' 不同?
  • @Bergi,我引用了 MDN。增加了参考和位说明
  • 但是 parseFloat 应该对字符串进行操作 - 为什么您希望它对数字进行操作?
  • @JuicyScripter 但是那个 MDN 页面正在解决一个不同的问题并描述如何使用正则表达式。在这种情况下,我仍然不明白为什么parseFloat 是必要的以及它增加了什么价值。请您试着解释清楚,并举例说明+xxxxx 的含义与parseFloat(+xxxxx) 不同的情况?
  • @torazaburo,没有真正的理由使用parseFloat(+xxx),这只是纯粹的开销。请参阅我的更新答案。
猜你喜欢
  • 2011-04-20
  • 2017-03-29
  • 1970-01-01
  • 2020-02-20
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
相关资源
最近更新 更多