一次搞懂parseInt

1,278 阅读3分钟

语法:

parseInt([string], [radix]);

  • [string]为要转换的字符,一般为字符串,如果不是字符串则会先转换成字符串。遵循其他类型值转换字符串的规则。
  • [radix]为进制数,是2~36的一个数字,包含236
    • 不传的话、传0或者传undefined,一般默认值是10;
    • 但是遇到[string]0x0X开头,则默认值为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/88^-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

其他的一些注意点

  • radix10以上时,用英文字母表示大于9的数字;例:对于十六进制(radix为16),则使用AF表示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