不常用不代表你不用去理解它,或许哪次装逼就用上了。
前阵子在stackOverflow上看到两个这样的问题:
为什么parseInt(8,3) == NaN,parseInt(16,3) == 1?
为什么parseInt(‘dsff66’,16) == 13?
parseInt大家应该都很熟悉了,我们一般用他来把一个小数或字符串转换为整数,正常情况下我们都是这样做的:
|
|
函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符组成的数字。
但是parseInt的第二个参数很多朋友就不太清楚了,因为本身就很少使用第二个参数,我们看看MDN上对第二个参数的解释:
一个2到36之间的整数值,用于指定转换中采用的基数。比如参数”10”表示使用我们通常使用的十进制数值系统。总是指定该参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当忽略该参数时,不同的实现环境可能产生不同的结果。
最后说到如果忽略的话,不同环境会有不同结果,大家不用担心,ES5已经规定了如果省略就代表用十进制解析。
第二个参数是2~36之间的整数值,这个值其实就是我们说的进制,比如,我们用二进制去解析第一个参数,那么就这么做:
|
|
下面我们来分析一下上面的两个问题,相信大家对这第二个参数就能有个透彻的认识了。
为什么parseInt(8,3) == NaN,parseInt(16,3) == 1?
先来看第一个parseInt(8,3) ,这里的意思就是用,三进制去解析8,我们知道二进制是遇2进1,三进制同样,遇3进1,比如我要用三进表示十进制中的5,那么就是12,也就是(2(3^0))+(1(3^1))=5;
所以在三进制中,出现的最大的数字也就是2,8这个数字不可能出现在三进制中,所以返回NaN。
parseInt(16,3)同样,出现最大的数字是2,那么6就是被自动忽略掉,所以parseInt是直接用三进制去解析1,得到的当然是1了。
为什么parseInt(‘dsff66’,16) == 13?
我们知道,平时使用parseInt,它会忽略到除数字之外的字符,但是这里不一样,因为十进制最大的数字是9,但是到了十一进制往上,最大的数字是两位数了,这当然不行,所以从10开始往上,就用字母代替,a==10,b==11……z==35;所以你知道为什么parseInt的第二个参数要规定在2~36了吗?
再看看上面这道问题,在16进制中,最大的数字是15,对应字母也就是f,超过f的字母也就超出了16进制的解析范围。
‘dsff66’的第一个字符是d,也就是十进制中的13,第二个字符s,代表十进制中的28,这显然超出了16进制的解析范围,所以s和它之后的字符都会被parseInt自动忽略,所以我们得到13。
相信看到这里,你对parseInt的第二个参数已经完全了解了,如果你对进制之间的转换不太了解的话,可以多去网上学习学习进制之间的转换,就算平时用不着,还是可能拿来装X嘛。
另外补充一下,另一个函数parseFloat只接受一个参数,只能使用十进制去解析。
本文作者:余震(Freak)
本文出处:Rockjins Blog
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!