为什么map中使用parseInt第二个元素返回NaN,用Number却正常?
问题核心原因
Array.prototype.map 调用传入的回调函数时,会默认传递3个参数:
- 第一个:当前遍历到的数组元素
- 第二个:当前元素的索引值
- 第三个:原数组本身
你直接把parseInt作为参数传给map时,相当于每次遍历都会把这三个参数透传给parseInt,而parseInt本身可以接收2个参数:第一个是待解析的字符串,第二个是解析用的进制基数(radix),所以此时第二个参数(索引值)会被当成进制基数使用,才会出现异常。
具体执行过程示例
假设你的输入num为1234,split('')后得到的数组为['1','2','3','4'],使用map(parseInt)的实际执行逻辑如下:
- 索引0:调用
parseInt('1', 0),进制基数为0时parseInt默认按十进制解析,返回1 - 索引1:调用
parseInt('2', 1),合法的进制基数范围是2~36,基数1不合法,直接返回NaN - 索引2:调用
parseInt('3', 2),二进制的合法数字只有0和1,不存在3,返回NaN - 索引3:调用
parseInt('4', 3),三进制的合法数字只有0、1、2,不存在4,返回NaN
这就是索引为1的元素总返回NaN的原因,甚至后续索引的元素也大概率返回异常值。
为什么用Number就正常
Number函数只有一个入参,额外传入的参数会被直接忽略,所以不管map传了多少个参数,Number只会取第一个元素做转换,因此运行符合预期。
坚持使用parseInt的修正写法
主动用箭头函数包裹,只传递第一个参数,同时显式指定十进制基数避免其他隐式问题:
const result = num.toString().split('').map(str => parseInt(str, 10)).map(n => n * n);
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

