【问题标题】: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 不同:
- 如果输入已经是一个数字,数字函数不会执行“双重转换” (ref)
- Parse float 将输入转换为字符串,然后提取数字 (ref)
- Number 函数返回大多数数据类型的常识值,例如
Number(true) 产生 1
- 解析浮点数使用输入的字符串值,因此
parseFloat(true) 尝试从"true" 解析数字并产生NaN
- 当输入字符串为无效数字时,数字函数会失败,例如
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