绝望之parseInt

看完《你不知道的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

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

有没有种恍然大明白的感受 😄

解析

Infinity19 进制解析,第一个字符 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进制解析
复制代码
相关文章
相关标签/搜索