parseInt用法详解

今天在 MDN 深究了下 parseInt 的用法,顿时觉得头要炸了,后来花了些时间总算搞明白了,写下来记录下,免得以后范蒙。

1. 用法

parseInt(string, radix);
一句话描述其作用就是将用 radix 进制表示的 string 最终转换为十进制。

2. 具体实践

举几个基本的小栗子:

1
2
3
4
parseInt('255') // 255 不写 radix 参数指定几进制时,一般默认采用十进制,建议始终带第二个参数
parseInt('11', 2) // 3
parseInt('011', 8) // 9
parseInt('0x11', 16) // 17

看过这些,是不是想说挺简单的啊,也就那么回事儿。那我们来看几类特殊的东西,恶心一下。

(1) 以正常进制数作为 radix

1
2
3
4
parseInt(' 11', 10) // 11 从第一个不是空字符的数字开始 parse
parseInt(' a11', 10) // NaN 第一个不是空字符的字符不是数字,转换为 NaN
parseInt(' 11a11', 10) // 11 从第一个不是空字符的数字开始, 截止到下个非数字的字符进行 parse
parseInt(' ') // NaN 仅空字符转换为 NaN

(2) 以 0 或 undefined 作为 radix
1
2
3
4
5
6
parseInt('011', 0undefined) // es3 9 | es5+ 11
parseInt(011, 0undefined) // 9
parseInt(0x11, 0undefined) // 17
parseInt('0x11', 0undefined) // 17
parseInt('0xx11', 0undefined) // NaN
parseInt('0x11x11', 0undefined) // 17

结论:radix 为 0 或者 undefined,会根据情况解析为 8进制、10进制、16进制,
当去除空字符以 0 开头时, 数字会被认为是8进制进行parse,字符串在 es3 会认为是8进制,但 es5 废除了这个规则,按10进制处理。
当去除空字符以非0数字开头时,按10进制处理。
当去除空字符以 0x 开头时,无论是字符串还是整数都按 16 进制进行 parse。 0x后面直接紧跟字母会 parse 为 NaN, 如果是 16进制数后又加其他非数字字符串,则只 parse 数字部分。