在将字符串转换为数字时,parseInt()和Number()的行为如何不同?
当前回答
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
前两个将提供更好的性能,因为它返回一个原语而不是一个对象。
其他回答
我发现在几种将字符串转换为int的方法中有两个性能比较链接。
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
远离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,但要注意前导零会迫使它进入八进制模式。
获得结果的另一种方法是使用~操作符
在大多数情况下
~~someThing === parseInt(something)
但是~~对于parseInt接受的带尾字符的字符串或带基数规范的字符串(例如十六进制)将返回0,并且当parseInt返回NaN时也将返回0。另一个区别是~~如果给定一个bigint,则返回一个你可以添加另一个bigint的bigint,而parseInt如果bigint很大,则返回一个普通的浮点数(是的,它给出的值与parseFloat完全相同)
但是在大多数情况下~~比parseInt快30%。当浮点数表示为字符串时,它只会慢10%。
因此,如果~~的限制范围更适合你的需要,那么就节省使用电脑的时间,减少打字的时间
parseInt转换为整数,也就是说,它去掉小数。数字不转换为整数。