杂谈:['1', '2', '3'].map(parseInt)

155 阅读2分钟

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

答案:[1, NAN, NAN]

一、parsetInt

parseInt(string, radix);

string:要被解析的值。如果参数不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略。

radix(可选):从 2 到 36 的整数,表示进制的基数。例如指定 16 表示被解析值是十六进制数。如果超出这个范围,将返回 NaN

console.log(parseInt('12131')); // 基准无效,基准未定义
console.log(parseInt('12131', 0)); // 基准无效,基准为0
console.log(parseInt('12131', undefined)); // 基准无效,基准为undefined
console.log(parseInt('12131', null)); // 基准无效,基准为null
console.log(parseInt('12131', 1)); // NAN 超出下限
console.log(parseInt('12131', 37)); // NAN 超出上限
console.log(parseInt('parseInt', 2)); // NAN 第一位无法转换成字符字符串
console.log(parseInt('312131', 2)); // NAN 第一位'3'超出基数2,直接解析失败,返回NAN
console.log(parseInt('12131', 2)); // 1 '12131'被截取成'1',表示从首位截取连续的小于技术2的字符串

二、map

// 箭头函数
map((element, index, array) => { /* … */ })
// 回调函数
map(callbackFn)

element:数组中正在处理的当前元素。

index:数组中正在处理的当前元素的索引。

arraymap方法调用的数组。

function selfParseInt(string, radix) {
    var result = Number(string);
    // console.log(string, radix, result)
    return result
}
console.log(['1', '2', '3'].map(selfParseInt))

运行结果为:

[1, 2, 3]

三、['1', '2', '3'].map(parseInt)

标题中的题目,相当于执行了:

function selfParseInt(string, radix) {
    var result = parseInt(string, radix);
    // console.log(string, radix, result)
    return result
}
console.log(['1', '2', '3'].map(selfParseInt))

又等价于:

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

可以看出parseInt('1', 0)radix为无效的基准,所以以其1进行转换,结果为1
parseInt('2', 1)parseInt('3', 2)中的radix都大于其string,故返回NAN

总结

题目中的问题进行拆解,将mapparseInt分别进行分析,然后再进行合并,即可清晰的明白其执行逻辑。