经典面试题[1,2,3].map(parseInt)解析

最近看到这道经典面试题[1,2,3].map(parseInt),本来想的很简单,不就是把1,2,3分别传入parseInt然后返回嘛,结果不应该是[1,2,3]嘛,但是看了答案才发现不是这么简单,还是要细心点多想想。。。

这道题目其实真心不难,只要相同了就好,我们拆解开来看。

map函数

map()方法创建一个新数组,其结果是该数组中每个元素都调用一个提供的函数后返回的结果。

1
2
3
let newArray = array.map((item[, index[, array]]) => {
// return...
})
  • item: 回调函数当前正在处理的元素
  • index: 正在处理元素的索引
  • array: 调用map的数组

一般来说我们只需要用到item就够了,但是这几个参数map方法是全部会传递给你的

划重点,item,index,array这几个参数在回调函数中是都可以接收到的

接下来看parseInt方法吧

parseInt

parseInt(string, radix)将一个字符串string转为radix进制的整数,返回解析后的整数的十进制数,如果无法解析则返回NaN。

  • string: 要解析到值
  • radix: 2-36之间的一个基数或者说进制。
1
2
3
parseInt(10) // 10 ---- 10进制的字符串'10'转成10
parseInt(10, 2) // 2 ---- 2进制的字符串’10‘转成2
parseInt(3, 2) // NaN --- 在2进制中不存在3

对于radix还需要注意在基数为 undefined,或者基数为 0 或者没有指定的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以”0x”或者”0X”开头, 则基数是16 (16进制).

  • 如果字符串 string 以”0”开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。

  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

综合map和parseInt

记住map方法中回调函数的第二个参数是操作元素的索引

所以

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

等同于

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

所以得到的结果数组应该是

1
[parseInt(1, 0), parseInt(2, 1), parseInt(3, 2)]

二进制中不可能有3,同样1作为基数也不可能有2

所以最终结果是

1
[1, NaN, NaN]
作者

胡兆磊

发布于

2022-08-23

更新于

2022-10-23

许可协议