字符串转数值应优先使用Number()、parseInt(str, 10)或parseFloat();parseInt按指定进制解析整数并截断,valueOf是包装对象方法,不用于字符串转换。

字符串转数值,最常用的是 parseInt 和 valueOf,但它们用途完全不同——parseInt 是全局函数,用于解析字符串中的整数;valueOf 是包装对象(如 Number)的方法,不直接处理字符串转换,常被误用。搞清区别,才能少踩坑。
parseInt:按进制解析字符串,返回整数
parseInt(str, radix) 从字符串开头读取,忽略前导空格,尽可能多地解析符合指定进制的数字字符,遇到非法字符就停止,返回整数(不是 Number 对象)。第二参数 radix 很关键:
- 必须显式传入
10,否则以0x开头会按 16 进制、以0开头在旧环境可能按 8 进制(ES5+ 已规范为 10 进制,但兼容性起见仍建议写明) - 如果首字符不能构成有效数字(如空格后是字母),返回
NaN - 它不四舍五入,只截断:例如
parseInt("3.14")→3,parseInt("3.99")→3
✅ 正确用法:
parseInt(" 0xff", 10) → 0(因为按十进制,“0xff”开头的 0 合法,f 非法,所以停在第一位)
parseInt(" 0xff", 16) → 255
parseInt("42px", 10) → 42
parseInt("abc", 10) → NaN
valueOf 不是用来“转换字符串”的
valueOf() 是 Number、String 等包装对象的原型方法,作用是返回该对象所包装的原始值。它本身**不接受字符串参数**,也不能直接把字符串变成数字。
常见误解写法:
Number.valueOf("123") ❌ —— 这其实是调用 Number 构造函数的静态方法,实际等价于 Number("123"),不是 valueOf 的本意
✅ 正确使用场景:
new Number(42).valueOf() → 42(返回原始数字)
(42).valueOf() → 42(原始值自动包装后调用)
它和字符串转换无关,别把它当成 parseInt 或 Number() 的替代品。
初学者更该掌握的“真·字符串转数值”方式
实际开发中,推荐根据需求选这三种更清晰、更安全的方式:
-
Number(str):严格转换。空字符串 →0," 123 "→123,"12.3"→12.3,"abc"→NaN。适合需要浮点数或想一并处理小数的场景 -
parseInt(str, 10):明确只取整数部分,且需控制进制。适合处理带单位的文本(如"100px")、版本号、ID 等 -
parseFloat(str):专门提取浮点数,支持科学计数法,"3.14e2"→314," -2.5abc"→-2.5
⚠️ 小提醒:所有这些方法遇到无效输入都返回 NaN,记得用 isNaN() 或 Number.isNaN() 判断,不要用 == NaN(因为 NaN !== NaN)。

















