parseInt 进制转换问题
今天在工作中遇到一个比较有意思的进制转换问题,在此做下记录,希望能帮助在利用parseInt做进制转换时遇到类似坑的同学。
首先我们看下 w3c 手册中对于parseInt的使用说明:
大概的意思是parseInt 共接收两个参数,其中第一个是一个字符串,第二个参数是进制基数,返回的结果是一个十进制数字。此时我们在浏览器中输入parseInt(072,8);系统返回的结果是5,你一定感到很诧异。下面我们来说明下这个结果到底是怎么解析的。
首先,我们在使用parseInt方法的时候,第一个参数的类型应该是字符串类型,也就是说如果我的写法是parseInt(“072”,8); 此时系统会给我返回正确的结果,即 58
问题到这里并没有结束,我没有按照规定语法使用,系统并没有报错,并给我返回了结果5,我们一起来研究下为什么偏偏是5呢?
原来,在javascript 中 当我们给一个数字加了前缀0,此时该数字串会被默认以8进制进行解析,这样的话,我们输入的072首先就被转义成了 58 也就是说,我明明写的parseInt(072,8) 实际解析的时候是 parseInt(58,8); 可是问题又来了,问什么会得到5这个一个个位数呢?
在仔细观察parseInt(58,8) 这个运算式子之后我们发现了端倪,58的末尾数字竟然是8,这是不符合规范的啊,一个表示8进制的数字串最后位数的值明明应该是小于8的才对,也就是说,我们这个数有错误了,不符合规范。这样的话,系统便会自动只截取第一个数字进行进制转换,也就是说,我们的式子最后变成了parseInt(5,8); 得出了结果5. 为了验证这个逻辑我们又试了,parseInt(12,2); 结果不出所料,返回的值为1 。至此,真相大白。