在将字符串转换为数字时,parseInt()和Number()的行为如何不同?


当前回答

我总是使用parseInt,但要注意前导零会迫使它进入八进制模式。

其他回答

远离parseInt而使用Number和Math是一个好主意。除非你需要十六进制或八进制。两者都可以使用字符串。为什么要远离它?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

它完全屠杀了大量或少量的人口。奇怪的是,如果这些输入是字符串,它正常工作。

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

与其冒着很难找到这个错误和人们提到的其他陷阱的风险,我只会避免parseInt,除非你需要解析除10进制以外的东西。数,数学。圆的,数学。和. tofixed(0)都可以做同样的事情,parseInt可以用来没有这些类型的错误。

如果你真的想要或需要使用parseInt来实现它的其他特性,千万不要用它来将浮点数转换为整数。

我总是使用parseInt,但要注意前导零会迫使它进入八进制模式。

parseInt() ->解析一个数字到指定的redix。

Number()->如果转换失败,则将指定值转换为其等效数值或NaN。

因此,要将一些非数字值转换为数字,我们应该始终使用number()函数。

eg.

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

parseInt()函数有各种各样的极端情况,因为它进行重定向转换,因此我们应该避免使用parseInt()函数进行强制转换。

现在,要检查所提供的值是否是Numeric,我们应该使用nativeisNaN()函数

typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

前两个将提供更好的性能,因为它返回一个原语而不是一个对象。

如果你正在寻找性能,那么最好的结果可能是按位右移“10”>>0。也可以乘(“10”* 1)或not not(~~“10”)。它们都比Number和parseInt快得多。 他们甚至有“feature”为非数字参数返回0。 下面是性能测试。