将一个数字传递给parseFloat()而不是字符串

在我的代码中,特定var的值可以源自任何一个不同的json源。 对于其中一些来源,相关的json元素将是一个字符串(例如"temp": "10.2" ),而对于其他来源,json元素将已经是一个浮点数(例如"temp": 10.2 )。

如果我只是通过一个parseFloat()传递json元素(来自任何源),它是否会造成任何伤害(是否有可能中断parseFloat() ,即使它已经是一个浮点数? 它似乎工作; 我只是想在未来或在不同的平台上考虑好的/坏的练习和可能的破坏。

谢谢。


你应该可以在float或string上调用parseFloat()而不会有任何问题。 如果它已经是一个浮点数,它会先转换为一个字符串,然后再转换为一个浮点数,所以效率稍低一些,但不应该太重要。

您仍然应该检查NaN的结果,以防数据中出现意想不到的情况。


将任何数据类型转换为数字的最合适方法是使用Number函数:

在非构造函数上下文中(即没有new运算符),可以使用Number来执行类型转换。

Number("1234")    // 1234
Number(1234)      // 1234

这种方法至少在这些方面与parseFloat不同:

  • 如果输入已经是数字,则数字函数不执行“双重转换”(ref)
  • 解析float将输入转换为一个字符串,然后提取数字(ref)
  • 数字函数返回大多数数据类型的常识值,例如Number(true)产生1
  • Parse float使用输入的字符串值,因此parseFloat(true)尝试从"true"解析数字并生成NaN
  • 当输入字符串是无效数字时,数字函数失败,例如Number("123abc")产生NaN
  • 解析浮动尝试解析尽可能多的数字,例如parseFloat("123abc")产生123

  • 如果您确定该值始终是有效的数字,则应使用Number(stringOrNumber)

    如果你需要使用parseFloat()来增加一些安全性,你也可以编写你自己的函数,这也是性能优化的:

    function toFloat(value) {
      return typeof value === 'number' ? value : parseFloat(value);
    }
    

    我还创建了一个jsPerf测试用例,该用例显示,对于字符串和数字之间的1:1比率作为输入值,性能比朴素parseFloat()好> 30%。

    链接地址: http://www.djcxy.com/p/27587.html

    上一篇: Passing a number to parseFloat() instead of string

    下一篇: is this a correct conditional?