为什么你始终搞不明白 parseInt ?因为你只有在遇到了问题才会去找表面答案
parseInt
为什么你始终搞不明白 parseInt ?
- 你在遇到
parseInt(0.000008) // 0 你以为是 parseInt 给你取整得到 0
- 你在遇到
parseInt(0x0000008) // 8 你去百度,发现parseInt会将0.0000008转化为 8e-7
- ... ... 这里就不一一举例
说到底这种问题一而再再而三的出现,就是你从未思考过parseInt的作用是什么,是怎么工作的
parseInt 的作用是什么?
答:解析数字字符串
错误答案:取整,进制转换
parseInt 和 Number 的不同
- Number 是将字符串强制转换为数字,如果遇到引用类型,会首先进行强制类型转换,然后进行转换,如果遇到不能转换的字符会返回NaN
- 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 ‘()=>{}’ 无法被解析
转载自:https://juejin.cn/post/7208741162521247800