大概80%的前端小伙伴都不懂ParseInt是这么用的

SegmentFault

共 1638字,需浏览 4分钟

 ·

2021-11-05 14:51

作者:伯约同学
来源:SegmentFault 思否社区

说到JavaScript中的parseInt函数,不少同学可能觉得这个函数比较简单,就是一个把字符串转成整数的方法,第一时间想到的例子是这样的:
parseInt('1') // 1
parseInt('0.1') // 0
parseInt('8.8') // 8

熟不知,parseInt函数可传入两个参数:
第一个是需要被解析的字符串(如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。)
第二个表示要解析的数字的基数。(从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。请注意,10不是默认值!)
下面我们来看几个例子:
parseInt('11',2) // 3
parseInt("1f",16) // 31
parseInt(0.000000008) // 8

两个比较好理解,parseInt函数将第一个参数转成对应字符串,再按照第二个参数的进制进行输出。
但是第三个为什么会输出一个整数8而不是0呢?
且看第一条:如果一个参数不是字符串,则将其转换为字符串。
我们打印一下:
0.000008.toString() // '0.000008'
0.0000008.toString() // '8e-7'

可以看到,将一个很小的数转成字符串之后,就成了用e字符进行表示了~~
当然,如果一个数太大的话,也会使用到e字符。
这个时候,parseInt函数发现,哎,这个e字符我不认识啊,那怎么办呢?截断!’e’前面的我转一下完事了,后面的不管啦就。
所以,在处理非常大或非常小的数时,会有一些意想不到的情况发生。
再来关注一下第二点,即第二个参数的基数默认值并不是10。那我怎么计算呢?
搞两个简单的例子说明一下:
parseInt('0xF') // 15
parseInt('-0xA') // -10

对照MDN上的解释,可以看得明明白白:
1、parseInt 可以理解两个符号。+ 表示正数,- 表示负数(从ECMAScript 1开始)。它是在去掉空格后作为解析的初始步骤进行的。如果没有找到符号,算法将进入下一步;否则,它将删除符号,并对字符串的其余部分进行数字解析。
2、如果 radix 是 undefined、0或未指定的,JavaScript会假定以下情况:
3、如果输入的 string以 “0x“或 “0x“(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被当做十六进制数去解析。
4、如果输入的 string以 “0“(0)开头, radix被假定为8(八进制)或10(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix。/4、如果输入的 string 以任何其他值开头, radix 是 10 (十进制)。

如果第一个字符不能转换为数字,parseInt会返回 NaN。


点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流,扫描下方”二维码“或在“公众号后台回复“ 入群 ”即可加入我们的技术交流群,收获更多的技术文章~

- END -

浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报