JavaScript面试题:['1','2','3'].map(parseInt)

85 阅读2分钟

console.log(['1','2','3'].map(parseInt))会输出什么呢?

答案是这个

屏幕截图 2025-06-06 223340.png

如果你不清楚机制的话,肯定和这哥们一样扣问号了。

R-C.jpg

下面我们一步一步来分析一下吧。

分析

我们首先有一个数组['1', '2', '3'],这个数组每个元素是string类型,然后我们对这个数组对象用.访问其map方法,并给map方法传入一个参数,参数为函数parseInt。

哦哦,看样子要解决这个问题,关键是知道map方法有什么用,我们去MDN网站上查查看。

屏幕截图 2025-06-06 225258.png

屏幕截图 2025-06-06 225343.png

哦哦,原来map会将原数组中的元素都调用一次,然后把每个返回值组成一个新数组呀。


但是不对呀,map参数中并没有和parseInt相关的参数定义呀,那可能parseInt不是参数而是执行函数,即map通过parseInt函数执行后返回的结果来构建一个新数组。

在上面我们发现map其实还有三个参数,我们来把这三个参数测试一下吧。

['1', '2', '3'].map((num, index, arr) => {
    console.log(num, index, arr);
    return num;
})

结果为

屏幕截图 2025-06-06 231802.png

哦,确实第一个参数是迭代的每个元素,第二个参数为数组的索引,第三个参数为数组本身。

光看map的用法好像并不能解决我们的问题,我们再去MDN网站看看parseInt的用法吧

屏幕截图 2025-06-06 232049.png

哦,我们发现parseInt有一个可选参数,参数将指明被解析值是什么进制数,关键是后面,如果超出这个范围,将返回NaN,噢噢噢,是不是和我们的问题挂钩了。很有可能是我们把['1','2','3'].map((value, index) => parseInt(value, index))中map的index当作参数传给了parseInt,导致当index=0时,自动解析值是什么进制数,所以会输出1,而index为1或者2时,解析成了其他进制数,因为超出了范围,所以返回了NaN。

image.png

我们可以手动用parseInt试试看

console.log(parseInt('1', 0, ['1', '2', '3']));
console.log(parseInt('2', 1, ['1', '2', '3']));
console.log(parseInt('3', 2, ['1', '2', '3']));

输出

屏幕截图 2025-06-06 233008.png

哇,amazing!!!结果输出一模一样,就是因为

['1','2','3'].map(parseInt)

把数组index当作参数传递给了parseInt,所以才会发生这个问题 那我们怎么解决这个问题呢?

解决方法

因为parseInt的radix参数是可选的,所以我们可以手动只传一个参数,即

console.log(['1','2','3'].map(num => parseInt(num)))  // 明确只传一个参数

这样输出的结果就是正常的1,2,3了

屏幕截图 2025-06-06 233637.png