表单里输入「10px」,用 parseInt 取整得到 10,看着没问题。换成「08」,老浏览器里却可能出现 0 或者 8 不一致的情况,这就是基数在作怪。
它只认开头那段数字
parseInt 会跳过前导空格,从第一个正负号或数字开始读,一直读到不能转成数字为止。所以 parseInt(「10px」) 是 10,parseInt(「abc123」) 是 NaN。它不是严格转换,更像「尽量读一个整数」。
第二个参数必须写
parseInt(「08」, 10) 明确按十进制解析,结果就是 8。不写基数时,以 0x 开头的字符串会被当成十六进制,parseInt(「0x10」) 得到 16。现代浏览器对 08 默认按十进制,但老代码里的坑就是这么来的。团队规范里直接要求写 10,省得解释。
小数和科学计数法
parseInt(「3.9」) 是 3,直接截断,不四舍五入。parseInt(「1e3」) 是 1,因为读到 e 就停了。想要四舍五入用 Math.round,想要严格数值用 Number。Number(「10px」) 会得到 NaN,正好和 parseInt 相反。
什么时候该用它
从带单位的样式值里取整数,parseInt 很合适。表单输入的年龄、数量,建议先用 Number 或正则校验,再取整。金额不要用 parseInt,小数会被直接丢掉。
记住三件事:写基数 10、只信开头那段、别拿它当严格转换。大部分奇怪结果都能解释。
几个特殊输入的结果
parseInt(null) 得到 NaN,因为 null 会被转成字符串 null,第一个字符不是数字。parseInt(true) 也是 NaN。parseInt(空字符串) 同样是 NaN,没有可解析的数字。parseInt(「 42 」) 是 42,前后空格会被忽略。这些结果在表单校验里很容易埋坑,输入框为空时先判断,再调用 parseInt。
还有一个细节:parseInt 处理很大的数字时不会报错,但超过安全整数范围后精度会丢。订单号、身份证号这类长数字,不要用 parseInt 转,直接用字符串比较更安全。