parseInt问题

101 阅读2分钟
parseInt('0.0000005') // => 0

parseInt(0.000005) // => 0

parseInt(0.0000005)   // => 5

parseInt(0.000005, 10) // => 0

parseInt(0.0000005, 10)   // => 5

注意这里的 parseInt 第一个参数是浮点数的时候【而不是字符串】,实际上是转成了科学计数法。看下图所示

uTools_1641265045694.png

5e-6 转换为小数 0.000005,而5e-7没有转换成小数。也就是说浮点数的小数部分位数大于6位时会自动转换为科学计数法。再来看看parseInt对科学计数法的转换。

uTools_1641267556122.png

也就是把 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,则直接忽略。