likes
comments
collection
share

为什么你始终搞不明白 parseInt ?因为你只有在遇到了问题才会去找表面答案

作者站长头像
站长
· 阅读数 12

parseInt

为什么你始终搞不明白 parseInt ?

  1. 你在遇到parseInt(0.000008) // 0 你以为是 parseInt 给你取整得到 0
  2. 你在遇到parseInt(0x0000008) // 8 你去百度,发现parseInt会将0.0000008转化为 8e-7
  3. ... ... 这里就不一一举例

说到底这种问题一而再再而三的出现,就是你从未思考过parseInt的作用是什么,是怎么工作的

parseInt 的作用是什么?

答:解析数字字符串

错误答案:取整,进制转换

parseInt 和 Number 的不同

  1. Number 是将字符串强制转换为数字,如果遇到引用类型,会首先进行强制类型转换,然后进行转换,如果遇到不能转换的字符会返回NaN
  2. parseInt 是对字符串进行解析,如果遇到引用类型,会首先调用 toString 方法将参数转换为字符串(注意是 toString 不是 强制类型转换),再进行解析,如果遇到不能解析的字符会停止解析,返回。

parseInt 是怎样工作的?

parseInt( string , radix ) 接收 2 个参数,第一个参数一定是字符串,如果不是,内部首先会对第一个参数进行 toString 操作,转换成字符串,然后从字符串左边=>右边进行解析,第二个参数是将当前字符串看成 radix 进制的数字字符串,一般情况下 radix 默认为 10 , 特殊情况例如:0x 开头的,会默认为 16

依赖parseInt的 toString 进行类型转换,不是明智的选择,我们尽量避免向parseInt 传递非字符串参数

最后才是,解决问题,很多人不明白所以然,所以会经常遇到特殊例子

let a = '42'
let b = '42px'

Number(a) // 42
parseInt(a)  // 42

Number(b) // NaN
parseInt(b)  // 42
let a = {
    val:42,
    toString(){
        return this.val
    }
}

let b = {
    val:42,
    valueOf(){
        return this.val
    }
}

Number(a) // 42   // Number 会进行强制类型转换
parseInt(a)  // 42   // parseInt 会调用 toString

Number(b) // 42    // Number 会进行强制类型转换
parseInt(b)  // NaN   // parseInt 只会调用 toString
parseInt(1/0,19) // 18

// 第一步:1/0 = Infinity Infinity.toString()  'Infinity'

// I 在 19进制中 为 18,n 无法解析, 所以返回 18
parseInt(0.000008) // 0 来自 '0.000008' 中的第一个0 ‘.’ 无法解析,所以返回 0 

parseInt(0.0000008)  // 8 来自 '8e-7' 第一个 8 ,‘e’ 无法解析,所以返回 8
parseInt(false,16)  // 250,  'fa' 来自 'false' , 16进制中的 15 10 ,对应10进制 250

parseInt('0x11')    // 17 , 0x11 如果没有第二个参数,会被默认当成16进制

parseInt(103,2)     // 2   2进制中,3无法解析,所以解析 ‘10’  结果为 2

parseInt(function(){})  // NaN  'function' 10进制无法解析
parseInt(function(){},16)   // 15 'f' 来自 'function'
parseInt(()=>{},16)     // NaN   ‘()=>{}’ 无法被解析