语法:
parseInt([string], [radix]);
[string]为要转换的字符,一般为字符串,如果不是字符串则会先转换成字符串。遵循其他类型值转换字符串的规则。[radix]为进制数,是2~36的一个数字,包含2和36。- 不传的话、传
0或者传undefined,一般默认值是10; - 但是遇到
[string]以0x或0X开头,则默认值为16; - 如果取值是
2~36之外的数字,结果直接返回NaN。
- 不传的话、传
定义:
把
[string]看成是[radix]进制的数值,即在[string]中从左开始找到所有符合[radix]进制的字符,遇到不符合的或非有效数字则停止查找,然后把找到的数字转换成十进制数值返回;如果一个符合的字符都没找到则返回NaN。 一句话简单理解:parseInt 的功能就是把字符串当成指定进制的数值然后转换成十进制数值。
parseInt转换的示例:
let str = '123px456';
parseInt(str) // 123 `p`不是合法数字就截止查找了,不管后面有没有数字;
parseInt(str, 1) // NaN `2~36`之外的数字
parseInt(str, 2) // 1 二进制只有`0或1`是合法值
parseInt(str,3) // 5 -> `12` -> `2*3^0+1*3^1=5`
把其它进制值转换为10进制如何处理?
其他进制转十进制的规则:对应数字位的数字*对应进制的数字位次方之和。 示例:
- 假定123数一个四进制数,转换成十进制的运算过程:
3*4^0+2*4^1+1*4^2所以结果是27; - 转换中存在小数,则小数部分是负次方,计算方式是:1除于该进制数的对应正次方;如:
8^-1 -> 1/8;8^-2 -> 1/8^2 -> 1/64
let str = '12345.23'; //->假如str是个八进制数
3*8^-2 + 2*8^-1 + 5*8^0 + 4*8^1 + 3*8^2 + 2*8^3 + 1*8^4 -> 十进制的值
3*(1/64) + 2*(1/8) + 5*1 + 4*8 + 3*64 + 2*512 + 1*4096 =>5349.296875
其他的一些注意点
- 当
radix为10以上时,用英文字母表示大于9的数字;例:对于十六进制(radix为16),则使用A到F表示10~15; [string]前后是允许加空格的,处理方式是直接忽略;- 在解析小数的时候是截断返回小数点以前的数值;
- 在处理非常大或者非常小的数字时,会出现意外的结果:
BigInt。警告: parseInt将 BigInt转换为Number,并在这个过程中失去了精度。这是因为拖尾的非数字值,包括 "n",会被丢弃。
- 一个数字以
0开头的数字浏览器是会默认把他当成是八进制数,然后自动转换成十进制数。所以
parseInt(0123) = 83其实是parseInt(83),parseInt并不会识别八进制,它只会识别16进制和十进制。
经典面试题
[1,2,3].map(parseInt) // [1, NaN, NaN]
// 等价于
[1,2,3].map((v, i) => parseInt(v, i))
// 再拆分map里面的执行
parseInt(1, 0) // 1
parseInt(2, 1) // NaN
parseInt(3, 2) // NaN
let arr = [27.2, 0, '0013', '14px', 123];
arr.map(parseInt) // [27, 0, 1, 1, 27]
--- 解析 ---
parseInt('27.2',0) -> 27
parseInt('0',1) ->NaN
parseInt('0013',2) ->'001'当做2进制转换为10进制 1*2^0 + 0*2^1 + 0*2^2 ->1
parseInt('14px',3) -> '1'当做3进制转换为10进制 1*3^0 -> 1
parseInt('123',4) -> '123'当做4进制转换为10进制 3*4^0 + 2*4^1 + 1*4^2 -> 27
参考MDN