['1', '2', '3'].map(parseInt) 输出的结果是什么?why?

589 阅读2分钟

第一眼看到这个题目的时候,脑海跳出的答案是[1,2,3,4],但是真正的答案是[1,NaN,NaN,NaN]。

1.首先让我们回顾一下,map函数的第一个参数callback:

const new_array = arr.map((value, index, array) => {})

这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。

2. 而parseInt则是用来解析字符串,使字符串成为指定基数的整数。

parseInt(string, radix) 接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。

3. 了解这两个函数后,我们可以模拟一下运行情况

parseInt('1', 0) => 1 // radix为0时,且string参数不以'0x'和'0'开头时,按照10为基数处理。这个时候返回1
parseInt('2', 1) => NaN // 基数为1(一进制)表示的数中,这里的参数没有在2~36范围之间,所以为NaN。
parseInt('3', 2) => NaN // 基数为2 (二进制)表示的数中,二进制能解析的最大值为1,最大值小于'3','3'在二进制中是一个非法的值,所以无法解析,返回NaN。
parseInt('4', 3) => NaN // 基数为3(三进制)表示的数中,三进制能解析的最大值为2,最大值小于'4', '4'在三进制中是一个非法的值,所以无法解析,返回NaN。

string是要被解析的值。如果参数不是一个字符串,则将其转化为字符串(使用ToString抽象操作),字符串开头的空白符将会被忽略。

radix一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。默认为10。 这里的参数需要的范围是2~36之间,如果小于2或者大于36,则parseInt()将返回NaN。

map函数返回的是一个数组,所以最后结果为[1,NaN,NaN]

这里可以改写成['1', '2', '3'].map((item, index) => { return parseInt(item, index) })更方便理解。