parseInt('0.0000005') // => 0
parseInt(0.000005) // => 0
parseInt(0.0000005) // => 5
parseInt(0.000005, 10) // => 0
parseInt(0.0000005, 10) // => 5
注意这里的 parseInt 第一个参数是浮点数的时候【而不是字符串】,实际上是转成了科学计数法。看下图所示
5e-6 转换为小数 0.000005,而5e-7没有转换成小数。也就是说浮点数的小数部分位数大于6位时会自动转换为科学计数法。再来看看parseInt对科学计数法的转换。
也就是把 5e-7 先转换为了 "5e-7",然后parseInt 把 5 后面的部分截断了。
在看另外一个问题,如下
['1', '2', '3'].map(parseInt); 打印什么
实际上这里转换为每个步骤就是
parseInt('1', 0); // 第二个参数是 0,null,undefined时,直接忽略,所以直接打印 1;
parseInt('2', 1); // 1进制只有0,没有2这个数字 所以第二个参数是1的情况下,直接返回 NaN;
parseInt('3', 2); // 二进制只有0和1,没有3这个数字,所以就直接返回NaN;
注意,parseInt 方法的第二个参数是对第一个参数的补充说明,而不是要转换的进制。parseInt 方法始终返回 NaN 或者 十进制数字,没有其他的返回值。
总结parseInt用法
- 将字符串转为整数。第二个参数默认是 10。
- 第一个参数自动 trim
- 如果parseInt的参数不是字符串,则会先转为字符串再转换。
- 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
- 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。
- 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。
- 如果字符串以0开头,将其按照10进制解析。
- 如果参数以0开头,但不是字符串,则会先将数值转成字符串,然后解析,见第三条规则。
- 对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
- 如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略。