parseInt
parseInt 将字符串解析为整数,第二个参数 radix 指定进制(2~36),radix=0 时按十进制自动推断。
#type / concept
#status / evergreen
#resource / javascript
#resource / ecmascript
[!info] related notes
- 相关概念: higher-order-function-callback-mismatch, ecmascript-type-conversion
- 对比:
Number(),parseFloat(), 一元+
parseInt
一句话定义
parseInt(string, radix) 将字符串解析为指定进制的整数,忽略尾部非数字字符。
签名
parseInt(string)
parseInt(string, radix)
| 参数 | 类型 | 含义 |
|---|---|---|
string | string | 要解析的值(非 string 会先被转成 string) |
radix | number | 进制,范围 2 ~ 36。0 或省略时按十进制自动推断 |
返回值
返回解析出的整数。如果第一个非空格字符不能转成数字,返回 NaN。
radix 行为详解
| radix | 行为 |
|---|---|
0 或省略 | 十进制(但字符串以 0x 开头则按十六进制) |
2 ~ 36 | 按指定进制解析 |
< 2 或 > 36 | 返回 NaN |
1 | 非法,返回 NaN |
parseInt('10') // 10(默认十进制)
parseInt('10', 0) // 10(radix=0 等同省略)
parseInt('10', 2) // 2(二进制 10 = 十进制 2)
parseInt('10', 8) // 8(八进制 10 = 十进制 8)
parseInt('10', 16) // 16(十六进制 10 = 十进制 16)
parseInt('ff', 16) // 255
parseInt('1', 1) // NaN(radix 必须 >= 2)
parseInt('1', 37) // NaN(radix 必须 <= 36)
解析规则
从字符串开头开始读,跳过前导空格,遇到第一个不能作为该进制数字的字符就停止:
parseInt(' 123abc') // 123(忽略前导空格,读到 a 停止)
parseInt('abc123') // NaN(开头就不是数字)
parseInt('0x10') // 16(自动识别十六进制前缀)
parseInt('010', 10) // 10(指定十进制,不按八进制处理)
与其他转换方式对比
| 方式 | '123' | '123abc' | ' 45 ' | 'abc' | null |
|---|---|---|---|---|---|
parseInt(s) | 123 | 123 | 45 | NaN | NaN |
Number(s) | 123 | NaN | 45 | NaN | 0 |
+s | 123 | NaN | 45 | NaN | 0 |
parseFloat(s) | 123 | 123 | 45 | NaN | NaN |
关键区别:parseInt 会忽略尾部非数字字符('123abc' → 123),Number 不会('123abc' → NaN)。
经典陷阱:map(parseInt)
详见 higher-order-function-callback-mismatch。
['1', '2', '3'].map(parseInt)
// parseInt('1', 0) → 1
// parseInt('2', 1) → NaN
// parseInt('3', 2) → NaN
// 结果:[1, NaN, NaN]
原因:map 会传 (value, index),index 被误当作 radix。
正确用法
// 显式指定 radix
parseInt('10', 10) // 10
// 转整数的推荐方式
Math.trunc(Number('123.45')) // 123
Number.parseInt('10', 10) // 10(ES6 全局入口,等同 parseInt)
// map 中正确使用
['1', '2', '3'].map(x => parseInt(x, 10)) // [1, 2, 3]
['1', '2', '3'].map(Number) // [1, 2, 3]