别再用 map(parseInt),我也是最近才发现问题出在哪

这事说出来有点尴尬。我一直以为 ['1', '2', '3'].map(parseInt) 会返回 [1, 2, 3],直到最近碰到了一个诡异的 bug,才意识到自己一直理解错了。

运行这段代码:

js 复制代码
console.log(['1', '2', '3'].map(parseInt));

你会得到:

js 复制代码
[1, NaN, NaN]

是不是感觉哪不对劲?


map 和 parseInt 怎么就掰了?

先简单回顾下两个函数的参数形式:

js 复制代码
arr.map((value, index, array) => {})
parseInt(string, radix)

重点在这里:map 会把当前值、索引、原数组都传进去。而 parseInt 的第二个参数是 进制,不是索引。

所以上面这段代码,其实执行的是:

js 复制代码
parseInt('1', 0); // 1,自动识别为十进制
parseInt('2', 1); // NaN,1进制非法
parseInt('3', 2); // NaN,2进制没有 3

结果自然就变成 [1, NaN, NaN]


正确做法其实很简单

只要你别让 parseInt 误收到第二个参数就行了。

方法一:包一层箭头函数

js 复制代码
['1', '2', '3'].map(str => parseInt(str)); // [1, 2, 3]

方法二:直接用 Number

js 复制代码
['1', '2', '3'].map(Number); // [1, 2, 3]

这个方式更直观,也更不容易踩坑。


为什么这个问题容易被忽略?

主要两个原因:

  1. 平时我们都把 parseInt 当作"字符串转数字"的函数,很少注意它的第二个参数是进制。
  2. map(parseInt) 也没有语法错误,但参数传错了,结果就全乱了。

这种问题不容易第一时间发现,尤其调试时根本不会去怀疑 map(parseInt) 这行写法。


顺带说一下:parseInt 和 map 到底是干嘛的?

parseInt 是干嘛的?

parseInt 用来把字符串转成整数:

js 复制代码
parseInt('10');      // 默认是十进制,结果 10
parseInt('10', 2);   // 二进制,结果 2
parseInt('A', 16);   // 十六进制,结果 10
parseInt('abc');     // 转不了数字,结果 NaN

注意:第二个参数是"进制",合法范围是 2 到 36。


map 是干嘛的?

map 是数组的方法,用来生成一个新数组,对每一项做处理:

js 复制代码
['1', '2', '3'].map(x => Number(x)); // [1, 2, 3]

users.map(user => ({
  ...user,
  online: true
}));

forEach 不一样,map 会返回新数组。


写法对比一览表

写法 结果 是否推荐
['1','2','3'].map(parseInt) [1, NaN, NaN] ❌ 不推荐
['1','2','3'].map(str => parseInt(str)) [1, 2, 3] ✅ 推荐
['1','2','3'].map(Number) [1, 2, 3] ✅ 推荐

总结一句话

别再用 map(parseInt),会出问题。

这不是语法错,是你传错了参数。改成箭头函数或者用 Number,就不会踩坑。


如果你也遇到过类似的"奇怪行为"

欢迎评论区一起交流。我踩过坑,你就别踩了。

如果这篇文章对你有点帮助,点个赞/收藏就当是支持一下~

相关推荐
巴拉巴拉~~24 分钟前
Flutter高级动画艺术:掌握交错动画,打造丝滑精致的UI体验
javascript·flutter·ui
咸鱼加辣42 分钟前
【前端框架】路由配置
javascript·vue.js·前端框架
咸鱼加辣43 分钟前
【前端框架】一段普通的 JavaScript 程序
开发语言·javascript·前端框架
雪域迷影1 小时前
怎么将.ts文件转换成.js文件?
javascript·typescript·npm·tsc
narukeu1 小时前
聊下 rewriteRelativeImportExtensions 这个 TypeScript 配置项
前端·javascript·typescript
小北方城市网1 小时前
第2课:零基础前端框架实操入门——从核心语法到第一个完整项目
javascript·ai·正则表达式·json·html5
枫子有风1 小时前
Day6 前端开发(from teacher;HTML,CSS,JavaScript,Web APIs,Node.js,Vue)
javascript·css
晚烛9 小时前
实战前瞻:构建高可靠、强协同的 Flutter + OpenHarmony 智慧教育平台
javascript·flutter·html
保护我方头发丶10 小时前
ESP-wifi-蓝牙
前端·javascript·数据库
董世昌4111 小时前
什么是扩展运算符?有什么使用场景?
开发语言·前端·javascript