经典面试题:
['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:数组中正在处理的当前元素的索引。
array:map方法调用的数组。
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。
总结
题目中的问题进行拆解,将
map和parseInt分别进行分析,然后再进行合并,即可清晰的明白其执行逻辑。