map(parseInt) 返回值问题

解析 ['1','2','3'].map(parseInt) 为什么返回 [1, NaN, NaN]

问题

['1','2','3'].map(parseInt) 的返回值是什么?

解答

这个问题涉及 mapparseInt 两个函数的参数传递机制。

函数签名

map 方法的回调函数接收三个参数:

arr.map(function callback(currentValue, index, array) {
  // Return element for new_array
})

parseInt 函数接收两个参数:

parseInt(string, radix)

其中 radix 是基数,取值范围 2-36。

实际执行过程

map 调用 parseInt 时,会将 index 作为第二个参数传入:

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

// 等价于:
// parseInt('1', 0)  -> 1   (radix 为 0 时按十进制处理)
// parseInt('2', 1)  -> NaN (radix 为 1 无效)
// parseInt('3', 2)  -> NaN ('3' 不是有效的二进制数)

返回值是 [1, NaN, NaN]

正确的写法

如果需要返回 [1, 2, 3],应该指定基数为 10:

function parseIntFun(item) {
  return parseInt(item, 10)
}

['1','2','3'].map(parseIntFun)
// 或者
['1','2','3'].map(item => parseInt(item, 10))

关键点

  • map 的回调函数会接收三个参数:当前值、索引、数组本身
  • parseInt 的第二个参数是基数,会被 map 自动传入索引值
  • parseInt(string, 0) 按十进制处理,parseInt(string, 1) 返回 NaN
  • 使用 map(parseInt) 时需要包装函数来控制参数传递