别再用 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,就不会踩坑。


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

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

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

相关推荐
kyriewen3 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
NeilCarmack7 小时前
Deepseek-harness增加桌面版端序列:第 2 讲 · spawn Electron:当前进程如何“交棒“
前端·javascript·electron
এ慕ོ冬℘゜10 小时前
使用 jQuery 动态渲染表格与状态切换
前端·javascript·jquery
智购科技自动售货机厂家11 小时前
2026自动售货机AI视觉识别优化:从YOLOv11n模型量化到RKNN部署的端侧推理工程实践~YH
javascript·人工智能·yolo·机器学习·计算机视觉·目标跟踪·perl
晓说前端11 小时前
TypeScript 核心语法应用 —— Vue 3 中的使用(下)
前端·javascript·typescript·类型系统
lancyu14 小时前
# Agent Loop:AI Agent 的唯一直心骨
开发语言·javascript·人工智能
半个落月15 小时前
JavaScript 单例模式详解:从唯一实例到按钮事件
javascript
weixin_BYSJ198716 小时前
springboot智慧公共交通系统---附源码51123
java·javascript·spring boot·python·django·flask·php
你别说话了1 天前
Vue项目解决跨域
前端·javascript·vue.js