You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:45:08