map(parseInt) 输出分析

分析 ['10', '10', '10'].map(parseInt) 的输出结果

问题

['10', '10', '10', '10', '10'].map(parseInt) 的输出是什么?

解答

parseInt 函数

parseInt() 解析字符串并返回指定基数的整数。

parseInt(string, radix)

参数说明:

  • string: 要解析的值
  • radix: 基数,介于 2-36 之间的整数,默认为 10
  • 返回值: 整数或 NaN

map 方法

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

arr.map(function callback(currentValue, index, array) {
  // Return element for new_array
})
  • currentValue: 当前元素
  • index: 当前索引(可选)
  • array: 原数组(可选)

执行过程

当执行 ['10', '10', '10', '10', '10'].map(parseInt) 时,map 会将 currentValueindex 传递给 parseInt

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

实际执行:

parseInt('10', 0) // 10 (radix 为 0 时,按十进制解析)
parseInt('10', 1) // NaN (不存在一进制)
parseInt('10', 2) // 2 (二进制的 10 是十进制的 2)
parseInt('10', 3) // 3 (三进制的 10 是十进制的 3)
parseInt('10', 4) // 4 (四进制的 10 是十进制的 4)

因此输出结果为:

['10', '10', '10', '10', '10'].map(parseInt)
// [10, NaN, 2, 3, 4]

关键点

  • map 的回调函数会接收三个参数:元素值、索引、原数组
  • parseInt 接收两个参数:字符串和基数
  • map(parseInt) 会将索引作为基数传入,导致非预期结果
  • radix 为 0 时按十进制解析,为 1 时返回 NaN
  • 正确做法:arr.map(item => parseInt(item, 10))