parseint支持进制转换(如parseint("1010",2)→10),parsefloat仅支持十进制且识别科学计数法;parseint遇小数点即止,parsefloat可解析一位小数点;两者均忽略开头空格,但parseint依赖前缀(如"0x"),parsefloat则将"0x"视为非法;失败均返回nan,需用number.isfinite校验。

JS 中数值转换最常踩的坑,往往就出在 parseInt 和 parseFloat 这两个函数上——它们看着简单,用错一丁点,结果就离谱。
进制支持:只有 parseInt 能指定进制
parseInt 支持第二个参数 radix(2–36 之间的整数),比如:
-
parseInt("1010", 2)→ 10(二进制转十进制) -
parseInt("FF", 16)→ 255(十六进制转十进制) -
parseInt("0o77", 8)→ 63(八进制字面量 + 显式 radix)
而 parseFloat 没有 radix 参数,只认十进制。传入带前缀的字符串,它会从开头合法数字部分开始解析,遇到字母就停:
-
parseFloat("0xFF")→ 0(只取到 "0","x" 非法) -
parseFloat("FF")→ NaN(首字符不是数字) -
parseFloat("12.34e2")→ 1234(支持科学计数法,这是它独有的优势)
小数点处理:一个管整数,一个管小数
parseInt 遇到小数点立即停止,只返回整数部分:
-
parseInt("12.99")→ 12 -
parseInt("12.34px")→ 12 -
parseInt("12..34")→ 12(第二个点直接算非法字符)
parseFloat 会识别第一个小数点,并继续往后解析,直到第二个小数点或非法字符:
-
parseFloat("12.99")→ 12.99 -
parseFloat("12.34px")→ 12.34 -
parseFloat("12.34.56")→ 12.34(第二个点终止)
空格与前缀:自动忽略 vs 严格依赖
两者都跳过开头的空白(空格、制表符等),但对前缀的处理完全不同:
-
parseInt(" 0x1A ", 16)→ 26(空格被忽略,前缀“0x”生效) -
parseInt("\t0b1010", 2)→ NaN(tab 后不是“0b”,无法识别为二进制前缀) -
parseFloat(" 123.45 ")→ 123.45(空格无影响) -
parseFloat(" 0x1A ")→ 0(只取开头的“0”,“x”让它停下)
所以,用 parseInt 解析带前缀的字符串时,务必确保开头没有不可见字符;更稳妥的做法是先 .trim() 再解析。
失败返回与边界检查
两者在解析失败时都返回 NaN,但触发条件不同:
- 字符串为空、全空格、或首字符非数字(及正负号)→ 都返回 NaN
-
parseInt("")→ NaN,parseFloat(" ")→ NaN -
parseInt("abc123")→ NaN(没找到有效数字开头)
实际使用中,不能只靠 if (num) 判断,因为 0 是 falsy 值。应统一校验:
!isNaN(num) && isFinite(num)- 或更简洁:
Number.isFinite(num)
另外,parseInt 对大小写不敏感("AF" 和 "af" 都能正确解析为 175),但 parseFloat 不处理字母,这点无需担心。











