['1', '2', '3'].map(parseInt) // 输出[1, NaN, NaN],而不是第一眼感觉[1,2,3]
map函数接受3个参数,parseInt也接受2个参数,上面的操作实际上相当于:
['1', '2', '3'].map((item, index, arr) => {
return parseInt(item, index)
})
// parseInt第二个参数为转换时使用的基数进制
因此每一步相当于:
parseInt('1', 0) // 1(进制位为0或为空,会被根据第一个参数来判断当前进制,这里被当成十进制)
parseInt('2', 1) // 2不属于一进制中的数=》NaN
parseInt('3', 2) // 3不属于二进制中的数=》NaN
延伸题:
let unary = fn => val => fn(val)
let parse = unary(parseInt)
console.log(['1.1', '2', '0.3'].map(parse)) // [1, 2, 0]
// 相当于
let parse = (val) => parseInt(val)
['1.1', '2', '0.3'].map((item, index, arr) => {
return parse(item)
})
// 也就相当于
['1.1', '2', '0.3'].map((item, index, arr) => {
return parseInt(item) // 只指定了一个参数,因此返回1,2,0
})
若想把字符串数组转为数字数组:
['1', '2', '3'].map(parseFloat) // 输出[1, 2, 3]
// parseFloat只接受一个参数
或:
['1', '2', '3'].map(Number) // 输出[1, 2, 3]