在前端开发中,我们经常会用到parseInt()
函数来将字符串转换成数值。但是,在特定的情况下,parseInt()
函数可能会返回出乎意料的结果。一个例子就是:当我们将1/0
作为第一个参数传递给parseInt()
函数,并且将19
作为第二个参数传递时,它会返回18
而不是Infinity
。那么,这是为什么呢?本文将对此进行详细讲解。
parseInt()函数简介
在正式讨论问题之前,让我们先了解一下parseInt()
函数的基本用法和工作原理。
parseInt()
函数可以将一个字符串转换为整数。它的语法如下:
parseInt(string[, radix])
其中,string
参数表示要进行转换的字符串,radix
参数表示要使用的进制数。如果省略radix
参数,则默认使用十进制。
例如,下面的代码将把字符串"10"
转换成数值10
:
const str = "10"; const num = parseInt(str); console.log(num); // 输出 10
如果我们明确指定要使用十六进制,则可以这样写:
const str = "FF"; const num = parseInt(str, 16); console.log(num); // 输出 255
进制转换
在十进制数字系统中,每个位置上的数字的权值是10的幂次方。例如,在数字1234
中,4
的权值为 $10^0$,3
的权值为 $10^1$,以此类推。因此,这个数字可以表示为:
$$ 1\times 10^3 + 2\times 10^2 + 3\times 10^1 + 4\times 10^0 $$
不同进制的数字系统中,每个位置上的数字的权值是不同的。例如,在二进制数字系统中,每个位置上的数字的权值是2的幂次方。在八进制和十六进制数字系统中,每个位置上的数字的权值分别是8和16的幂次方。
因此,如果要将一个数字从一种进制转换为另一种进制,我们需要按照不同进制的规则进行计算。
例如,把二进制数1101
转换成十进制数的过程如下:
$$ \begin{aligned} &1\times 2^3 + 1\times 2^2 + 0\times 2^1 + 1\times 2^0 \ =& 8 + 4 + 0 + 1 \ =& 13 \end{aligned} $$
parseInt()函数的工作原理
当我们把一个字符串传递给parseInt()
函数时,它会尝试将字符串转换成整数。parseInt()
函数从左到右解析字符串,并在遇到第一个不能转换成数字的字符时停止解析。例如,字符串"123abc"
会被解析成数字123
。
在大多数情况下,我们可以省略第二个参数radix
,这时parseInt()
函数会默认使用十进制进行转换。但是,在某些情况下,我们可能需要指定要使用的进制数。
当我们将1/0
作为第一个参数传递给parseInt()
函数,并且将19
作为第二个参数传递时,它会返回18
而不是Infinity
。这是因为,在第二个参数radix
为19的情况下,parseInt()
函数会认为1/0
表示的是一个十九进制数,而不是无穷大。
那么,如何把无穷大表示为十九进制数呢?答案是:不能。因为在十九进制数字系统
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/7937