JavaScript 的 parseInt('08')

众所周知,parseInt() 是用来把字符串转换成整数的函式,一般来说,只要是数字开头的字符串,都能够转换成功,例如 parseInt('123a') 的结果为 123parseInt('12 34') 的结果为12

关于 parseInt() 有个著名的情况,有些人称为臭虫,让各位自己来评断。

parseInt('01') 得出的结果是1,事实上,一直到 07 为止,都能得到预期结果,问题来了,parseInt('08') parseInt('09') 这两者运算的结果,都得到0,这是为什么呢?

主要原因在于 parseInt() 这个函式,本身可以传递两个参数,语法是:

parseInt(string, radix)

第一个参数 string 当然是要转换为数字的字符串,第二个参数 radix 则是要用二进制、还是八进制或十六进制,又或是最熟悉的十进制来解译这个字符串呢?

也就是说,如果 parseInt('FF',16),代表以 16 进位方式来解析FF这个字符串,当然得到的结果就是 255 了,同理,parseInt('FF',10) 10 进位来解析FF这个字符串,根本就不是数字,所以得到的结果会是 NaN

但大多数人不会特别指定第二个参数,这时 JavaScript 就自动判断第一个传递的参数是否为某种数字型式。

JavaScript 眼中,以 0x 开头的字符串,都视为十六进制字符串,如果单单是0开头,第二个字母不是 x,则视为八进制或二进制字符串,十六进制使用的字母计有 0-9A-F,而八进制使用的字母则为 0-7,所以,当发生parseInt('08') 又未指定以何种数值型态解析时,JavaScript 0 为起头,接下来的字母又不是 x,那一定是八进制了,但是,八进制里,怎么可能有 8 9 这两个字母呢?所以,一定是不合法的字符串,于是就传回 0

同理,parseInt('010') 回传的值,也不是 10,而是 8,因为 parseInt() 认为 0 开头,接下来的字母不是 x,而是 1,就以二进制来解析 010 这个字符串,所以一切问题都在于以 0 开头,所造成的误会。

最好的解决办法,就是别偷懒,把第二个参数也加进去,例如 parseInt('08',10)parseInt('010',10),那就万无一失了!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值