深度剖析parseInt处理机制

419 阅读1分钟


1. 一道面试题

let arr = [10.18, 0, 10, 25, 23];
arr = arr.map(parseInt);
console.log(arr);

相信很多人会很自信的写出[10,0,10,25,23],这样就了大错特错,这题主要考察parseInt的第二个参数。

2. parseInt的第二个参数

parseInt([value],[radix])

-> [radix] 这个值是一个进制,不写或者写0默认都按照10处理(特殊情况:如果value是以0X开头,则默认值不是10而是16) 

-> 进制有一个取值的范围:2~36之间, 如果不在这之间,整个程序运行的结果一定是NaN 

-> 把[value]看做[radix]进制,最后把[radix]进制转化为十进制

3. 把一个值转换为十进制

[位权值:每一位的权重,个位是0,十位是1...] 

147(八进制) => 十进制 

1*8^2 + 4*8^1 + 7*8^0 

12.23(四进制)=> 十进制 

1*4^1 + 2*4^0 + 2*4^-1 + 3*4^-2

4. 解答

map遍历的结果如下

arr.map(parseInt(item,index)=>{})
=>parseInt('10.18',0(10))=>10  //进制为0默认为10进制
=>parseInt('0',1)=>NaN //‘进制取值2-36,不在这区间输出NaN’
=>parseInt('10',2)  //进制为2,value有效转换数字为0和1
   =>1*2^1+0*2^0=>2
=>parseInt('25',3)  //进制为3,value有效转换数字为0、1、2,所以5不参与计算
   =>2*3^0=>2
=>parseInt('23',4)  //进制为4,value有效转换数字为0、1、2、3
  =>2*4^1+3*4^0=>11

最终结果是[10,NaN,2,2,11]