【问题标题】:Passing a number to parseFloat() instead of string将数字传递给 parseFloat() 而不是字符串
【发布时间】:2015-07-22 10:31:44
【问题描述】:

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

如果我只是通过parseFloat() 传递 json 元素(来自任何来源),即使它已经是一个浮点数,它是否会造成任何伤害(是否有可能破坏)?它似乎有效;我只是在考虑好的/坏的做法以及将来或在不同平台上可能出现的问题。

谢谢。

【问题讨论】:

    标签: javascript json numbers parsefloat


    【解决方案1】:

    您应该能够在浮点数或字符串上调用 parseFloat() 而不会有任何问题。如果已经是浮点数,先转成字符串,再转成浮点数,效率会低一些,不过应该没关系。

    您仍应检查 NaN 的结果,以防数据中出现意外情况。

    【讨论】:

      【解决方案2】:

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

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

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

      此方法至少在以下方面与parseFloat 不同:

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

      【讨论】:

        【解决方案3】:

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

        如果您需要使用parseFloat() 来提高安全性,您也可以编写自己的函数,该函数也经过性能优化:

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

        我还创建了一个jsPerf test case,它显示在字符串和数字之间以 1:1 的比例作为输入值时,其性能比普通的 parseFloat() 好 >30%。

        【讨论】:

          【解决方案4】:

          不,将数字传递给它没有问题

          MDN 表示只要可以转换为数字,就不会发生任何中断。

          如果第一个字符不能转换为数字,则parseFloat返回NaN。

          作为替代方案,您可以使用一元运算符+,它与parseFloat 的作用基本相同,如果不起作用,也会返回NaN

          例如:

          var myFloat = +('10.5');
          var myOtherFloat = parseFloat('10.5', 10);
          var alreadyAFloat = parseFloat(10.5, 10);
          
          console.log(myFloat === myOtherFloat && myOtherFloat === alreadyAFloat); // true
          

          【讨论】:

            【解决方案5】:

            无论是float 还是String,使用parseFloat() 更安全,可以避免各种错误。

            正如您所说,它始终有效,但如果您将其强制为浮点数,您将避免出现任何异常。

            例如:

            parseFloat('10.2', 10)parseFloat(10.2, 10) 都可以使用 完美,会给你同样的结果,即10.2

            【讨论】:

              【解决方案6】:

              就我个人而言,我从来不认为这是一个问题,老实说,我总是使用 parsefloat() 有一个原因,那就是安全。你永远无法确定会发生什么,所以总是预测更糟的情况:D

              【讨论】:

                猜你喜欢
                • 2021-06-21
                • 2020-07-09
                • 2011-08-22
                • 1970-01-01
                • 2011-04-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-11-26
                相关资源
                最近更新 更多