你不知道的parseInt

82 阅读2分钟

前言

在介绍parseInt之前我们先来看一道面试题:

const getInteger = () => {
  return ['1', '2', '3'].map(parseInt)
}

console.log(getInteger())

打印出来的是: [ 1, NaN, NaN ],是不是有点意外呢?首先我们对map方法应该是比较清楚的。数组的map方法会接受两个参数,第一个是回调函数,第二个是指定的对应this。并且传入的回调函数也会接收三个参数,第一个参数是当前正在处理的元素,第二个参数是当前的索引,第三个参数是调用map方法的数组本身。在这道题目中,parseInt相当于传入的回调函数,parseInt的第一个参数为当前处理的元素,第二个参数为当前的索引,所以这的['1', '2', '3'].map(parseInt)我们可以看成[parseInt('1', 0),parseInt('2', 1),parseInt('3', 2)],接下来我们就对parseInt进行分析了。

parseInt

parseInt(string, radix)解析字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。 1、如果parseInt的第一个参数类型不是一个string,会被转换为字符串,且开头空白符会被忽略。

console.log(parseInt(6)) // 6
console.log(parseInt('6'))  // 6

2、parseInt的第二个参数如果不是2-36的整数,并且不是0,就返回NaN。

console.log(parseInt(6, 1)) // NaN
console.log(parseInt('6', 38))  // NaN

3、第二个参数假如指定 0 或未指定,基数将会根据字符串的值进行推算。

console.log(parseInt('10')) // 10

console.log(parseInt('ox10')) // NaN 

console.log(parseInt('10')) // 第二个参数为空,会根据字符'10'推算出对应进制,而'10'不以0X, 0x, 0等开头,即默认为十进制


/* 第二个参数如果是字符串,会被尝试读取数字 */
console.log(parseInt('10', '32')) // 32

// 第二个参数如果是字符串,会被尝试读取数字,无法读取,默认基数将会根据字符串的值进行推算
console.log(parseInt('8', 'test')) // 8
console.log(parseInt('0x8', 'test')) // 8

本文开篇的题目

在介绍完parseInt之后我们回归之前的题目。之前介绍了题目最终可以看成返回[parseInt('1', 0),parseInt('2', 1),parseInt('3', 2)]。parseInt('1', 0)的第二个参数为0,即基数根据字符串推算以十进制进行解析,结果为1。parseInt('2', 1)的第二个参数为1,不在2-36整数中,也不为0,即返回NaN。parseInt('3', 2),第二个参数为2,即会根据二进制来解析字符,因为二进制中不能解析除0和1以外的字符,所以也为NaN,即最终返回[1, NaN, NaN]。