首先[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
以上若有不对,欢迎指正!