前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库Number parseInt parseFloat 字符串转数字
JavaScript值与类型

字符串转数字,Number()、parseInt、parseFloat 和一元加号有什么区别?

四种写法分成两派。Number() 和一元加号 + 规则完全相同,要求整个字符串都是合法数字,否则就是 NaN,空串算 0。parseInt 和 parseFloat 从左往右能读多少读多少,读到非法字符就停,空串是 NaN。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#值与类型
先看核心答案读代码示例
理解线索

严格整串派和贪心前缀派

  1. Number() 和 +去掉首尾空白后整串必须合法,支持 0x、0b、0o 和科学计数法
  2. parseInt读开头的整数部分,只认 0x 前缀,能指定进制
  3. parseFloat读开头的十进制小数,认科学计数法和 Infinity,只能十进制

空字符串和纯空格是最大的分歧点。Number('') 是 0,很多「空输入被当成 0 提交」的 bug 就是这么来的。

核心回答

先记住这个答案

Number(str) 和 +str 是同一套规则:去掉首尾空白后,整个字符串必须是一个合法的数字字面量,否则返回 NaN,空串和纯空格得 0。parseInt 和 parseFloat 是另一套规则:跳过开头空白,从左往右读,遇到第一个非法字符就停,把前面那段转成数字,一个字符都读不到才是 NaN。另外 parseInt 只取整数部分、能指定进制,parseFloat 能读小数和科学计数法、只认十进制。

  • Number() 和 + 规则一致:整串合法才行
  • parseInt 遇非法字符会停下
  • 空串经 Number 转换得到 0
  • parseFloat 认科学计数法,不认 0x

一张对照表看全差异

同样的字符串分别交给四种写法,差异一目了然。

同一组输入JavaScript
const inputs = ['42', ' 42 ', '', '12.5px', '3.14', '0x1F', '1e3', '.5', 'Infinity', 'abc']
for (const s of inputs) {
  const row = [Number(s), +s, parseInt(s, 10), parseFloat(s)]
  console.log(`'${s}'`.padEnd(11), row.join(' | '))
}
查看输出与解释
'42'        42 | 42 | 42 | 42
' 42 '      42 | 42 | 42 | 42
''          0 | 0 | NaN | NaN
'12.5px'    NaN | NaN | 12 | 12.5
'3.14'      3.14 | 3.14 | 3 | 3.14
'0x1F'      31 | 31 | 0 | 0
'1e3'       1000 | 1000 | 1 | 1000
'.5'        0.5 | 0.5 | NaN | 0.5
'Infinity'  Infinity | Infinity | NaN | Infinity
'abc'       NaN | NaN | NaN | NaN

前两列永远一样,因为一元加号内部调用的就是和 Number() 相同的转换。后两列的差异主要来自「读到哪里停」:parseInt 遇到小数点、e 就停,所以 '3.14' 得 3,'1e3' 得 1;parseFloat 能把小数点和指数读进去,但它只认十进制,'0x1F' 读到 x 就停在 0。'.5' 这一行也很典型:parseInt 第一个字符就是小数点,什么都没读到,得 NaN。 注意 parseInt(s, 10) 这里显式传了十进制,所以 '0x1F' 得 0;如果不传 radix,parseInt('0x1F') 会按十六进制得到 31。

不同场景该用哪个

选哪个不看喜好,看你是想「容忍多余字符」还是「发现脏数据」。

校验用户输入:用 Number()
表单里要求输入纯数字时,Number() 最合适,'12abc' 会直接变成 NaN,脏数据藏不住。它唯一的坑是空串得 0,所以要先判空:input.trim() !== '' && Number.isFinite(Number(input))。
解析带单位的值:用 parseFloat 或 parseInt
从 getComputedStyle 拿到的 '12.5px'、从文案里截出的 '3 件',本来就带着多余字符,这时要的正是「读开头那个数字」的行为。有小数用 parseFloat,确定是整数、或者需要按十六进制解析颜色值这种场景,用 parseInt 并传入 radix。
一元加号:只是更短的 Number()
+value 在需要快速转数字的地方很常见,比如 +new Date() 取时间戳、+input.value 取输入框数值。它和 Number() 唯一的行为差异在 BigInt:Number(10n) 得到 10,+10n 会抛 TypeError。团队代码里如果觉得 + 不够显眼,统一写 Number() 也完全可以。
回答前,多想一步

容易答错的地方

以为 Number() 会像 parseInt 一样读开头的数字
Number('12px') 是 NaN,不是 12。Number() 对字符串是全有或全无的。
以为 parseFloat 能解析所有数字写法
parseFloat('0x10') 是 0,parseFloat('0b11') 也是 0。它只认十进制和科学计数法,进制前缀一概不认。需要解析十六进制只能用 parseInt(s, 16) 或 Number('0x10')。
以为数字分隔符在字符串里也能用
1_000 在代码里是合法的数字字面量,但 Number('1_000') 是 NaN,parseInt('1_000') 是 1。分隔符只在源代码的字面量里有效,字符串转换时不认。
试着用自己的话回答

面试官还会怎么问?

Number(null) 和 Number(undefined) 分别是什么?

Number(null) 是 0,Number(undefined) 是 NaN。而 parseInt(null) 和 parseInt(undefined) 都是 NaN,因为它们先被转成字符串 'null' 和 'undefined',十进制下一个合法字符都没有。

Number(' \n 12 \t ') 能转成功吗?

能,得到 12。Number() 会去掉首尾的空白字符,包括空格、换行、制表符。但中间有空格就不行,Number('1 2') 是 NaN。

为什么 parseFloat 没有第二个参数?

因为它只处理十进制。带小数的非十进制字符串在实际业务里几乎用不到,规范就没有为 parseFloat 设计 radix 参数。需要其他进制只能用 parseInt,而它只能处理整数。

从一道题,走向一组知识

把知识连起来

值与类型

toFixed 返回什么类型?为什么 1.005.toFixed(2) 是 1.00 而不是 1.01?

字符串转成数字后常常要格式化回字符串显示,toFixed 就是反方向的那一步。

值与类型

怎么把十进制数转成二进制、八进制、十六进制字符串?有什么限制?

parseInt 按进制把字符串转成数字,toString(radix) 按进制把数字转回字符串,正好互逆。

参考资料

  • JavaScript:值与类型参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 一张对照表看全差异
  3. 不同场景该用哪个
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑