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

Passing a number to parseFloat() instead of string

本文关键字:parseFloat 字符串 数字      更新时间:2023-09-26

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

如果我只是通过parseFloat()传递json元素(来自任何源(,即使它已经是一个float,它会有什么害处吗?它似乎奏效了;我只是在考虑好的/坏的做法,以及未来或在另一个平台上可能出现的故障。

谢谢。

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

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

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

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

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

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

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

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

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

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

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

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

正如您所说,它总是有效的,但如果您强制它为浮点值,则可以避免出现任何异常。

例如:

parseFloat('10.2', 10)parseFloat(10.2, 10)都可以工作并将给您相同的结果,即CCD_ 24。

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