(1)基本用法
parseInt方法可以将字符串或小数转化为整数。如果字符串开头有空格(包括\t,\r,\n等),空格会被自动去除。
parseInt('123') // 123
parseInt(1.23) // 1
parseInt(' \t\r123') // 123
字符串转化为整数的时候,是一个个字符依次转换,如果遇到不能转换的字符,就不再进行下去,返回已经转换好的部分。
parseInt('8a') // 8
parseInt('12***') // 12
parseInt('12.34') // 12
parseInt('0xf00') // 3840
上面代码中,parseInt的参数都是字符串,结果只返回字符串头部可以转换为数字的部分。最后一行的0xf00可以转换为数字是因为0x是十六进制的标准同理0b,0o分别表示的二进制和八进制也可以。那么问题来了,要是一开始就是不能转换的字母呢?比如:“x”。
parseInt('x') // NaN
parseInt('+') // NaN
parseInt('+12') // 12
parseInt('-') // NaN
parseInt('-12') // -12
可以看见这种情况直接返回NaN,同样可以看见,如果出现了+\-号也会有特殊的处理。
parseInt([]) // Nan
parseInt([123]) // 123
parseInt([123,456]) // 123
parseInt(['123']) // 123
再看对数组的处理,对空数组不能转换为整数,返回了NaN,而对于可转换的数组也只转换了部分。
(2)进制转换
parseInt方法还可以接受第二个参数(2到36之间,为什么是2-36呢,进位制最小的就是2进制,比2再小就没意义了,至于36是0-9,a-z共36个可表示数值的元素,最大能表示为36进制。),表示被解析的数(第一个参数)的进制,返回该数对应的10进制值。
parseInt(1000,2) // 8
parseInt(1000,6) // 216
parseInt(1000,8) // 512
上述代码演示了第二个参数的作用,那么问题又来了,如果两者进位不统一怎么办?第二个值无效怎么办?等等问题,让我们一一解答。
首先如果第二个参数不是数值,则会自动转换为整数,只有在转换后在2-36之间,才有意义,否则返回NaN。如果第二个参数是0,undefined,null,[],Infinity,NaN等,则直接忽略。
parseInt(10,37) // NaN
parseInt(10,1) // NaN
parseInt(10,0) // 10
parseInt(10,null) // 10
parseInt(10,undefined) // 10
parseInt(10,[]) // 10
parseInt(10,NaN) // 10
parseInt(10,Infinity) // 10
其次,如果第一个参数是字符串或数值的时候,parseInt的行为不一致,如果第一个参数是数值,会先将这个数值转换为十进制,然后用第二个参数进行进制转换
parseInt(0o16,36) // 40
parseInt(14,36) // 40
上面代码中0o16会先被转换为十进制14,然后再用36进制进行进制转换,结果是40
而如果第一个参数是字符串,则会直接用指定进制进行解读,如果前一个参数中有超过进制最大基数的值则返回NaN
parseInt('0x11',36) // 42805
parseInt('x',36) // 33
parseInt('x',16) // NaN
第一个x会被当做33解析,第三个返回NaN是因为16进制最大基数是F,x超界了。
由于这种行为的不一致会导致如下现象。
parseInt(010,8) // NaN
parseInt('010',8) // 8
噫,为什么第一个会是NaN而第二个是8?由于行为不一致,第一个会先解析前一个参数转换为10进制是8,而第二个参数设置为8进制,8进制没有数表示8因此是返回NaN,而第二个里面会直接把这个数解析出来,就是8。
(3)科学计数法,由于科学计数法中有个e/E,因此在转换过程中也会出现些有趣的事情。
parseInt(1000000000000000000000.5,10) // 1
parseInt('1e+21',10) // 1
parseInt(0.0000005,10) // 5
parseInt('5e-7',10) // 5
在转换过程中,parseInt会将那些会自动转换为科学计数法的数字视为字符串,读到e的时候就不能解析了,因此出现了不正确的结果。