7

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

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

谢谢。

4

6 回答 6

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
于 2015-07-23T07:35:31.760 回答
1

您应该能够在浮点数或字符串上调用 parseFloat() 而不会出现任何问题。如果它已经是一个浮点数,它会先转换为字符串,然后再转换为浮点数,因此效率会降低一些,但应该没有太大关系。

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

于 2015-07-22T10:40:26.360 回答
1

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

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

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

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

于 2017-03-01T11:55:05.773 回答
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
于 2015-07-22T10:39:18.453 回答
0

无论是 afloat还是StringusingparseFloat()都更安全,可以避免各种错误。

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

例如:

两者parseFloat('10.2', 10)parseFloat(10.2, 10)都会完美地工作,会给你同样的结果,即10.2.

于 2015-07-22T10:41:13.753 回答
-1

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

于 2015-07-22T10:38:25.893 回答