文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

为什么在 JavaScript 中['1', '5', '11'].map(parseInt) 返回 [1, NaN, 3]

2024-11-29 19:51

关注

这怎么可能呢?parseInt是不是坏了? map() 是不是有bug?

他惊慌地抬头看,引来了Jake尖锐而令人不安的笑声。

Alex自称编程高手,以快速编码和简洁代码为傲。

尽管刚进入这个行业不久,他总是认为自己比团队其他人都强,固执地我行我素;所有善意的建议都被他当耳边风。

但Alex很快就要遭遇灾难性的失败了。这将是一次痛苦而令人谦卑的经历,他永远不会忘记。

一切都始于Alex和Cody被分配了一个项目任务。要让用户查看团队一直在开发的电子商务网站上的产品。

他们仍处于创业阶段,所有数据都存储和更新在CSV文件中。

产品名称、价格、数量...所有你在亚马逊等网站上能看到的常见信息。

当Alex得知要合作时,他傲慢地嗤之以鼻。

"我不需要和任何人合作,好吗?"他一边在电脑上打字,一边对善良的工程主管Jake冷笑道。"这简直就是从数据库获取数据然后在JSX中显示而已"。

"Alex,你需要学会与他人合作,我一直在告诉你这一点。"Jake带着耐心而勉强的微笑回应道。他已经习惯了这个人自我中心的行为。

"我不需要和任何人合作,我自己就能搞定。Cody只会用他那些关于可读性代码的废话拖我后腿。"

"Cody是我们最优秀的员工之一,他花时间是有原因的。我一直在告诉你,编码并不只是快速或简洁地写代码..."

"你总是对我说教,但你从不听我的。这次我只想一个人工作,行吗?" "拜托?"Alex迅速补充道,以避免听起来太粗鲁 - 当然,脸上仍带着那种傲慢的笑容。

Jake叹了口气。

"好吧,如果你能将这个字符串数组转换成相同的数字数组,我就让你一个人工作。"他一边说一边在旁边的纸上写道。

Alex简直不敢相信。纸上是一个简单的数组。

['1', '5', '11']

这一定是个陷阱问题。他怀疑地抬头看着Jake。

"认真的吗?你觉得我蠢到连这个都解析不了吗?"

"试试看,你只有一次机会。"Jake对这个年轻人表现出惊人的耐心,他应该得到一枚自制力勋章。

Alex带着得意的表情,打开了一个新的VS Code终端,傲慢地输入了看似显而易见的Node解决方案:

['1', '5', '11'].map(parseInt)

他得意洋洋地笑了,转身却看到Jake脸上带着了然的微笑 - 他立刻失去了平衡。

"你确定吗Alex?为什么不按Enter键,让我们看看实际的结果数组是什么。"

有点不确定的他,在最后时刻扫视了一遍简短的CLI代码以确保万无一失。

他接下来看到的东西震惊了他的内心。

这怎么可能呢? parseInt 是不是坏了? map() 是不是有bug?

他惊慌地抬头看,引来了Jake尖锐而令人不安的笑声。

"Alex,你被解雇了。"

"什么?!"Alex尖叫道。

"在我闭上眼睛又睁开之前收拾东西滚出去,你这个傲慢的蠢货!"

你看,Alex的失败并不是因为他不理解 map 和 parseInt -- 尽管理解它们本可以帮到他。

而是因为他痴迷于使代码尽可能简短,以牺牲可读性和清晰度为代价...

事实上,在99%的情况下,我们是这样使用 map 和 parseInt 的:

const doubles = ['1', '5', '11'].map((num) => num * 2);

console.log(doubles); // [2, 10, 22]

const num = parseInt('5');

console.log(num); // 👍 5 -- not NaN!

但是当你使用 map 和 console.log 时,你可能会对结果感到震惊:

const doubles = ['1', '2', '3'].map(console.log);

它为每个项目记录了3对数字!

这是因为 map() 回调实际上接受3个参数:

所以你实际上是用3个参数调用 parseInt :

// parseInt take 2 args max but JS compiler doesn't complain
['1', '5', '11'].map(parseInt)

// parseInt('1', '0', ['1', '5', '11'])
// parseInt('5', '1', ['1', '5', '11'])
// parseInt('11', '2', ['1', '5', '11'])

Alex从不知道 parseInt 接受1个或2个参数,并且对每种情况的行为都不同:

当有第二个参数时,它成为第一个数字参数的基数:

// 👎 invalid positive number, ignore
parseInt('1', '0'); // 1 ✅
parseInt('3', 'blah blah'); // 3

// 👎 invalid base (1)
parseInt('2', '1'); // NaN
parseInt('5', '1'); // NaN ✅

// 👎 '10' is 2 in base 2 (remember?)
parseInt('10', '2'); // 2
parseInt('11', '2'); // 3 ✅

尽管他对 map 和 parseInt 的知识一般,但只要更加明确,他本可以避免所有这些问题:

['1', '5', '11'].map((num) => parseInt(num));

缩短代码可能有利于减少混乱,但我们应该始终优先考虑清晰和可读的代码:

特别是当增加的长度并不是什么大问题时,你知道吗?

async function setTimeout() {
  // ❌
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log('Coding Beauty');
}

async function setTimeout() {
  // ✅
  await new Promise((resolve) => setTimeout(() => resolve(), 1000));
  console.log('Coding Beauty');
}
来源:大迁世界内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯