parseInt()容易忽略的细节

avatar

小引

为什么要说parseInt()?

parseInt()不是一个很基础的函数吗?就是把字符串转化为整数并且返回这个整数啊

是的,一开始接触这个函数我也是这么想的(可能因为之前自己学习的时候比较粗心看漏了很多知识点,如果一早有了解的话,可以不用看下去了,很基础的知识点而已)直到最近看到一道题目,发现自己得重新去仔细复习下这个函数了,顺便记录一下。

下面代码的运行结果是:

var a = parseInt("a10")

var b = parseInt('010')

var c = parseInt("10*22")

var d = parseInt("10"*"22")

var e = parseInt("10"+"22")

var f = parseInt(10+"22"*2/2)

document.write(a,b,c,d,e,f)

定义

parseInt() 函数可解析一个字符串,并返回一个整数。

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

当忽略参数 radix , JavaScript 默认数字的基数如下:

如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。

如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。

如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

语法

parseInt(string, radix)

参数 描述

string 必需。要被解析的字符串。

radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

举例

是的,之前我对parseInt()函数的学习内容就是以上的部分,忽略了很多细节和例子,以下用几个例子来补充一下这个函数容易让人遗漏的知识点

一:无视被解析字符串最前和最后的空格

如parseInt('11')和parseInt(' 11 ')是一样的

二:正规格式是parseInt(string,radix)。radix可以省略,radix为0或2-36之间的整数,用来表示被解析数值的进制。(注意不是解析返回结果的进制)。如果radix不在此范围内,返回NaN;如果radix 省略或者为0,则按默认进制对string进行解析。

如parseInt('11',37)返回NaN

三:解析从第一个可以解析的字符开始,到第一个不能解析的字符(如空格,标点符号等)结束。后面的字符不再解析。如果第一个字符不可以解析,则返回NaN。

如parseInt('a8989')返回NaN

四:Javascript 开放地支持一些数字字符串直接进行运算

10*10

10*"10"

"10"*"10"

10+"45"*"4"/2

甚至"12.5"*"8"

以上都返回 Number 类型的 100

这样总结下来,题目的答案就很明确了,

var a = parseInt("a10") ,输出NaN ,第一个字符不可以解析,则返回NaN

var b = parseInt('010') ,输出8 ? 上面不是说以0开始的字符串应该是以0开头的字符把其后的字符解析为八进制吗?这里答案不应该是8?看清楚一点,文档也写明了"ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字",下面其实还有一行注释:从 ECMAScript 5 开始,默认值为十进制基数 (10)。 所以在支持版本为es5之前的版本,parseInt("010") 为 8,es5及之后的都解析为10

var c = parseInt("1022"),输出 10 ,parseInt()函数解析到结束

var d = parseInt("10"*"22"),输出220 ,Javascript 开放地支持一些数字字符串直接进行运算,

var e = parseInt("10"+"22"),Javascript 开放地支持一些数字字符串直接进行运算,不包括单独+运算,这里的+会解析会字符串的拼接

var f = parseInt(10+"22"*2/2),输出32

总结

简单粗暴的一句话:温故而知新,可以为师矣