看完《你不知道的JavaScript(中册)》强制类型转换一章后,发现一个好玩的题目ui
console.log(parseInt( 1/0, 19 ))
// 18
复制代码
你没看错,结果是18 😂.spa
又想起以前的一道网红题code
为何
['1', '7', '11'].map(parseInt)
返回[1, NaN, 3]
cdn
这些看似莫名其妙的结果,其中隐含的就是咱们对 parseInt
缺少进一步的了解。书上已经给出了解析,这里我作一个稍微的提炼,分享给你们。blog
那道网红题网上有各类解析,你们能够自行搜索查看。这里我主要解析文章开始的那道题。ip
parseInt
用于将字符串强制类型转换为数字。解析容许字符串中含有非数字字符,解析按从左到右的顺序,若是遇到非数字字符就中止。而转换不容许出现非数字字符,不然会失败并返回 NaN。字符串
console.log(parseInt('10px'))
console.log(parseInt('width10px'))
// 10
// NaN
复制代码
基本用法没什么好分析的,咱们看下一个 🌰string
console.log(parseInt('12'))
console.log(parseInt('12', 2))
console.log(parseInt('12', 5))
// 12
// 1
// 7
复制代码
上面的代码中, parseInt
加入了第二个参数,看过网红题解析的同窗应该都知道第二个参数表示基数,即第一个参数基于几进制进行解析。it
基数的范围为2~36,若是第一个参数的字符没法使用基数解析,则中止解析。若是第二个参数不在2~36范围中,则 parseInt
直接返回NaN。io
上面的例子中, parseInt(12, 2)
的结果为 1
,缘由是第二个字符 2
没法被解析成二进制值,因此中断解析,返回 1
。
再看一下第一个参数彻底没法解析和基数超出范围的状况
console.log(parseInt('12', 1))
// NaN
console.log(parseInt('34', 2))
// NaN
复制代码
上面的例子没什么好分析的,结合注意点一看就懂。😁
说了这么多,尚未进入正题,文章开头的题目是为何
进入正题
parseInt是用于解析字符串的!若是第一个参数传入非字符串,那么它会被自动转换成字符串再进行解析。
再看一遍文章开始的题目
console.log(parseInt( 1/0, 19 ))
// 18
复制代码
首先1/0
结果为 Infinity
,转换成字符串就是 'Infinity'
, 因此上面的代码能够当作
console.log(parseInt('Infinity', 19))
复制代码
等等,你们第一反应多是
第一个参数是非数字,结果应该是NaN
你们别忘了,第二个参数是 19
,此时第一个参数按 19
进制解析的。19
进制 什么概念... A B C D E F G H I
是有意义的,分别表示 10 11 12 13 14 15 16 17 18
。
有没有种恍然大明白的感受 😄
Infinity
按 19
进制解析,第一个字符 I
被解析成 18
,第一个字符 n
没法被解析,中断执行,返回18。
嗯... 知道答案后,顿时索然无味
什么,还不够? 那再来看几道题
parseInt( 0.0000008 );
parseInt( false, 16 );
parseInt( parseInt, 16 );
parseInt( "0x10" );
// 8
// 250
// 15
// 16
复制代码
索然无味以后是否是又一顿抽搐😄,确定又在想 parseInt
真的使人绝望。
可是!parseInt
表示这个锅我不背,须要注意的点上面都已经列出来了,剩下的就是JavaScript其余坑的问题了。
这里仍是对上面的4道题作一个简单的提示吧,你们能够根据提示自行理解,有问题欢迎留言讨论。
console.log(0.0000008.toString())
// 8e-7
console.log(false.toString())
// 'false'
console.log(parseInt.toString())
// function parseInt() { [native code] }
// 0x开头的数字会被按16进制解析
复制代码