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

时间:2015-07-22 10:31:45

标签: javascript json numbers parsefloat

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

如果我只是将json元素(来自任何来源)传递给parseFloat(),即使它已经是浮点数,它是否会造成任何伤害(任何可能会破坏)?它似乎工作;我只考虑未来或不同平台上的好/坏做法和可能的破坏。

感谢。

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  

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

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

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

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

答案 2 :(得分:1)

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

如果使用parseFloat()需要一些额外的安全性,您还可以编写自己的功能,这也是性能优化的:

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

我还创建了一个jsPerf test case,显示效果比普通parseFloat()好30%,字符串和数字之间的比例为1:1作为输入值。

答案 3 :(得分:0)

没有将数字传递给它

没有问题

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

答案 4 :(得分:0)

使用float StringparseFloat()可以更安全地避免各种错误。

正如你所说它会一直有效,但是如果你强制它成为一个浮点数,你将避免得到任何异常。

例如:

  

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

答案 5 :(得分:-1)

就我个人而言,我无法看到这是一个问题,说实话我总是会使用parsefloat(),原因之一就是安全。你永远无法确定会发生什么,所以总是预测会更糟:D