map(parseInt) 返回值问题
解析 ['1','2','3'].map(parseInt) 为什么返回 [1, NaN, NaN]
问题
['1','2','3'].map(parseInt) 的返回值是什么?
解答
这个问题涉及 map 和 parseInt 两个函数的参数传递机制。
函数签名
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)时需要包装函数来控制参数传递
目录