[1,2,3].map(parseInt) 之重新认识 parseInt

144 阅读2分钟

首先[1,2,3].map(parseInt) 这个面试题刚刚出来时就很懵,现在回想起来还是很经典。下面先讲解这个题:

1、 map方法‌:map方法会遍历数组中的每个元素,并对每个元素执行提供的函数,然后返回一个新数组,其中包含执行结果。

2、parseInt函数‌:parseInt函数用于解析字符串,并返回一个整数。它有两个参数:第一个参数是要解析的字符串,第二个参数是可选的基数(radix),用于指定解析时使用的数字系统(如二进制、八进制、十进制、十六进制等)。

当没有指定基数(radix)时,它会根据字符串的开头来决定解析的进制。如果字符串以“0x”开头,则解析为十六进制;如果以“0”开头但不是“0x”,则解析为八进制;如果以其他数字开头,则解析为十进制。如果字符串中包含非数字字符,parseInt会停止解析并返回之前的值。

let num1 = parseInt("123"); console.log(num1); // 输出: 123

let num2 = parseInt("101", 2); // 二进制
console.log(num2); // 输出: 5
let num3 = parseInt("A", 16); // 十六进制
console.log(num3); // 输出: 10

let num4 = parseInt("010"); // 默认十进制
console.log(num4); // 输出: 10
let num5 = parseInt("0x10"); // 十六进制
console.log(num5); // 输出: 16

处理非数字字符

let num6 = parseInt("123abc");
console.log(num6); // 输出: 123

特殊情况

parseInt(1 / 0, 19); // 返回 18,因为 "Infinity" 的第一个字符 "I" 在基数 19 下对应值为 18。
parseInt(false, 16); // 返回 250,因为 "fa" 在十六进制下对应值为 250。

回到标题中的面试题,解析一下

   //  [1,2,3].map(parseInt)
   [1,2,3].map((item,index) => {
       return parseInt(item, index)
   })

因此很容易得出答案了,但注意的是 parseInt 的使用:

// 当要解析的数中有超过基数的
parseInt(16,3)  // 3进制只能0、1、2,遇到6无法解析,就只解析能够解析的数字部分

// 当要解析的数中第一个值就超过基数的
parseInt(66,3)

// 十六进制也是如此
parseInt('dsff66'16)

总结:即只取基数进制下的数字,若遇到超过基数的则直接停止解析,若第一个就超过基数则直接返回NaN

以上若有不对,欢迎指正!