被一个parseInt()弄迷糊了~

2,017 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

最开始接触parseInt()就只是用它来取整,直到后来。。。害~ 是我大材小用了😢。下面,就来看看它到底是怎么回事,至此也有我自己的一些疑惑,渴望得到大佬们的解答~👀

parseInt(string, radix) 参数


  • string 参数为必须要传的字符串

  • radix 为可选参数。

    表示要解析的数字的基数,该值介于2到36之间。

    如果要省略这个参数或这个参数值为0,则数字就以10作为基数来解析。

    如果它以“0x”或“0X”开头,将以16作为基数进行解析。

    如果该数值小于2或大于36,则解析结果为NaN。

    返回值为解析后的数字。

当只有第一个参数时


parseInt()运行机制从第一个非空字符串开始转换(开头和结尾的空格是允许的)。

① 如果string不是数字字符、加号或者减号则返回NaN,空字符串的情况也会返回NaN。

    let jx1 = parseInt('hhh'); // NaN
    let jx2 = parseInt(''); // NaN

② 如果string是数值字符、加号或减号也是依次检查字符至末尾,或者碰到非数值字符。

    let jx1 = parseInt('123hhh'); // 123
    let jx2 = parseInt('12.9'); // 12

③ 如果string是数值字符且以“0x”或“0X”开头则会被解释为十六进制整数。

    let jx1 = parseInt('0xA'); // 10
    let jx2 = parseInt('0Xf'); // 15

④ 如果string是数字字符且以0开头,则其后字符在非严格模式下可能被解释为八进制或十六进制的数字。

⑤ 如果string是数字字符且以1~9开头,则会被解释为十进制整数。

出现第二个参数时


其中radix并不代表进制只是要解释数字的基数。

根据上面的规则让我们来看些好玩的~

parseInt('10'): 默认基数radix为10,string为数字开头,则解释为十进制整数。

运算规则:parseInt('10') = 1101+0100=101*10^1 + 0*10^0 = 10

parseInt('10', 2) : 基数为2,string为数字且符合二进制规则,则解释为二进制整数。

运算规则:parseInt('10', 2) = 120+021=11*2^0 + 0*2^1 = 1

parseInt('1f', 16) : 解释为16进制,基数为16。

运算规则:parseInt('1f', 16) = 1161+15160=311*16^1 + 15*16^0 = 31 (f:15)

parseInt('17', 6):1 属于6进制范围,7不属于6进制范围,当解析到某一位大于radix的string时它就只会解析到他的上一位,所以parseInt('17', 6) = parseInt('1', 6) = 1

parseInt('17', 9):基数为9,string为数字开头,解释为9进制整数,1和7都属于9进制范围。

运算规则:parseInt('17', 9) = 191+790=161*9^1 + 7*9^0 = 16


当然如果需要一个严格的方法来解析整形值(不允许出现非数字)这里就贴一个官方的代码

    filterInt = function (value) {
      if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value))
        return Number(value);
      return NaN;
    }

    console.log(filterInt('421'));               // 421
    console.log(filterInt('-421'));              // -421
    console.log(filterInt('+421'));              // 421
    console.log(filterInt('Infinity'));          // Infinity
    console.log(filterInt('421e+0'));            // NaN
    console.log(filterInt('421hop'));            // NaN
    console.log(filterInt('hop1.61803398875'));  // NaN
    console.log(filterInt('1.61803398875'));     // NaN

好了,到此就是有关parseInt()的一些相关知识,我的疑问是有关第二个参数的问题,在红宝书第四版的37页明确写出了是“用于指定底数(进制数)”,后来网上查阅相关资料就有所出入,现在有些懵懵的~ 有木有大神来科普一下捏~🤞