首页
/ freeCodeCamp 基础 JavaScript 实战:彻底掌握 parseInt() 字符串转整数与 convertToInteger 挑战

freeCodeCamp 基础 JavaScript 实战:彻底掌握 parseInt() 字符串转整数与 convertToInteger 挑战

2026-09-07 09:13:38作者:韦蓉瑛

本指南以 freeCodeCamp 开源课程中 basic-javascript(基础 JavaScript)板块的经典编程题 "Use the parseInt Function" 为对象,完整讲解 parseInt() 的字符串解析与整数返回机制,并逐条拆解该挑战的题目要求、测试断言与标准答案。读完本文后,你不仅能正确通过这一关,还能理解 parseInt() 返回 NaN 的触发条件,并为紧随其后的二进制解析(radix 基数)挑战打下基础。

挑战题目本体:一行看懂 parseInt()

该挑战的源码文件位于 587d7b7e367417b2b2512b23.md。它的 YAML front matter 定义了一个标准课程挑战:

---
id: 587d7b7e367417b2b2512b23
title: Use the parseInt Function
challengeType: 1
forumTopicId: 301183
dashedName: use-the-parseint-function
---

其中 challengeType: 1 对应 JavaScript 类编程题——在 challenge-types.ts 中可以看到 const js = 1 的映射,前端会据此为该题渲染代码编辑器与测试运行面板。题目 titleidforumTopicIddashedName 等字段则会由 challenge-schema.js 中的 Joi 规则做格式校验,保证每道挑战的元数据合法统一。

parseInt() 核心定义:字符串 → 整数

原文档对 parseInt() 给出了简洁而本质的定义:

parseInt() 函数解析一个字符串并返回一个整数。

const a = parseInt("007");

上面的函数调用把字符串 007 转换成了整数 7

parseInt("007") 之所以得到 7,是因为该函数会从字符串中尽可能多地识别数字字符并把它们解析成数值,而数字串前导的 0 不携带数值意义(十进制下),因此被省略。这个例子同时揭示了一个易混淆点:parseInt() 的入参是字符串,返回值是数字(number)类型,二者并不相同——"007" 是三个字符组成的字符串,7 则是一个可直接参与算术运算的数值。

原文档随后给出了另一条关键规则:

如果字符串中的第一个字符无法被转换成数字,那么函数返回 NaN

这里的 NaN(Not a Number)是 JavaScript 中表示"非数值"的特殊值,注意它本身的类型却是 number。这意味着一个「看起来不像数字」的输入并不抛异常,而是温和地返回 NaN 让你自行判断。

从 ECMAScript 规范角度补充:parseInt 的判定过程

结合 ECMAScript 对 parseInt 的定义,可以更完整地描述其内部处理逻辑(规范级通用行为):

  1. 先忽略输入字符串首部的空白字符;
  2. 允许可选的 + / - 符号前缀;
  3. 从符号之后的位置开始,逐字符读取目标进制下合法的数字字符,直到遇到第一个无法识别的字符为止——此字符及其后的内容被直接丢弃;
  4. 若第一步读取阶段一个有效数字都没读到(即首字符无法被转换),则返回 NaN

这正好解释了文档中的两种典型结果:

输入 过程 结果
parseInt("007") 依次读取 007,前导零不改变数值 7(number)
parseInt("JamesBond") 首字符 J 无法转换为数字 NaN

挑战目标解读:实现 convertToInteger

原文档的指令部分(--instructions--)给出了这一关的具体任务:

convertToInteger 函数中使用 parseInt(),让它可以接收输入字符串 str,将其转换成整数并返回。

也就是说,这关不要求你写出复杂的算法,而是训练一个非常常见的工程习惯:把来自输入框、URL 参数或配置文件中的字符串,安全地转换成可计算的整数

题目在 --seed--(种子代码)中为你预留了函数骨架:

function convertToInteger(str) {

}

convertToInteger("56");

调用 convertToInteger("56") 的结果会被用于测试校验,你的任务就是补全函数体,让它的返回值满足后面所有断言。

测试断言逐条拆解:搞懂 freeCodeCamp 如何判题

该挑战的 --hints-- 小节定义了 5 条自动化测试,这正是 freeCodeCamp 题目的判题标准。理解它们能帮你定位"差在哪一行":

断言 1:必须使用 parseInt()

assert(/parseInt/g.test(__helpers.removeJSComments(code)));

正则 /parseInt/g 会在剔除注释后的参赛代码中检索 parseInt 字样。注意 removeJSComments 这个细节——即使你把 parseInt 写进注释里也算通过(但显然不是正解),同时也意味着用别的手段(如 Number(str)、一元加号 +str)即便结果正确,此题也会被判定为未按要求实现。

断言 2~3:类型与数值双重校验

assert(typeof convertToInteger('56') === 'number');
assert(convertToInteger('56') === 56);

先验证返回值类型确实是 number,再验证其值严格等于 56。类型检查很有意义:很多人会误把 String 转换结果拼回字符串,或返回 "56" 这样的字符串,第一步就会暴露问题。

断言 4:常规字符串转整数

assert(convertToInteger('77') === 77);

验证函数对普通十进制数字字符串的处理正确。

断言 5:非数字输入返回 NaN

assert.isNaN(convertToInteger('JamesBond'));

assert.isNaN 要求返回值是 NaN。这是对 parseInt 失败语义的验证:遇到首字符无法解析的输入,应当返回 NaN 而不是报错或返回 0

参考答案:一行 return 解决战斗

该挑战在 --solutions-- 中给出的官方标准实现极为精简:

function convertToInteger(str) {
  return parseInt(str);
}

把输入字符串 str 直接交给 parseInt()return 其结果,即可一次性满足全部 5 条断言:

  • parseInt("56")56,类型为 number,断言 2、3 通过;
  • parseInt("77")77,断言 4 通过;
  • parseInt("JamesBond")NaN,断言 5 通过。

实战中的易错点自查

在完成此题时,下面几个坑值得自检:

  1. 漏写 return:只写 parseInt(str); 而不返回,函数结果为 undefined,类型断言(typeof ... === 'number')直接失败;
  2. 把参数写死parseInt("56") 这种硬编码会让个别用例"碰巧"通过,但换用 "77" 等其它输入时立即出错,务必使用形参 str
  3. 误解入参类型parseInt() 的入参虽是字符串,但工程中常直接传入数字或其它类型——该函数会先把参数强制转成字符串再解析,例如 parseInt(7.8) 实际处理的是 "7.8",得到 7
  4. 遇到非数字开头的输入返回 NaN 是正常设计:请勿试图"兜底"把它改成 0,否则无法通过 assert.isNaN 这条用例。

课程上下文:这道题在 freeCodeCamp 体系中的位置

basic-javascript.json 这个板块结构中,Use the parseInt Function(id 结尾 ...2b23)与紧随其后的 Use the parseInt Function with a Radix(id 结尾 ...2b22)彼此相邻,共同组成「字符串解析」知识点的两步训练;再往后便是三元运算符与递归相关的函数式编程挑战。

也就是说,本挑战承担的是 "无基数解析"的第一步:先掌握 parseInt(string) 在默认十进制下的基本用法,理解字符串与整数之间的转换语义。等你提交通过后,下一关将在此基础上引入第二个参数 radix。

下一步预告:带 radix 的二进制解析

紧接本挑战的 587d7b7e367417b2b2512b22.md(Use the parseInt Function with a Radix)指出:

parseInt() 接受第二个参数 radix(基数),用于指定字符串中数字的进制,radix 可以是 2 到 36 之间的整数。

例如:

const a = parseInt("11", 2);   // "11" 视为二进制 → 整数 3

它要求把 convertToInteger 写成:

function convertToInteger(str) {
  return parseInt(str, 2);
}

从而让 convertToInteger("10011") 返回 19convertToInteger("111001") 返回 57,而对 "JamesBond" 依然返回 NaN。可以看出,两道题共用同一个函数模板,差异仅在是否显式传入基数参数——这正是本关帮助你建立的函数抽象思维在起作用:把输入规范化(string → int)这一职责独立封装成函数,方便复用与测试

小结

通过本挑战你掌握了三个层面的内容:

  • 语法层parseInt(string) 将字符串解析为整数,前导零会被省略;
  • 语义层:当字符串第一个有效字符无法转换为数字时返回 NaN,这是标准的失败信号而非异常;
  • 工程层:在 convertToInteger 中把"字符串输入 → 整数输出"封装为可测试的纯函数,并理解 freeCodeCamp 测试断言(类型检查、值比较、isNaN)是如何逐条验证这一行为的。

接下来建议你在编辑器中自行练习几个变体输入(如带前导空格的 " 42"、带符号的 "-7"、带小数点的 "3.99"),观察 parseInt 的输出规律,然后带着这些经验直接挑战下一关的 radix 二进制解析。

登录后查看全文
热门项目推荐
相关项目推荐