为什么parseInt(1/0, 19)返回18?

在前端开发中,我们经常会用到parseInt()函数来将字符串转换成数值。但是,在特定的情况下,parseInt()函数可能会返回出乎意料的结果。一个例子就是:当我们将1/0作为第一个参数传递给parseInt()函数,并且将19作为第二个参数传递时,它会返回18而不是Infinity。那么,这是为什么呢?本文将对此进行详细讲解。

parseInt()函数简介

在正式讨论问题之前,让我们先了解一下parseInt()函数的基本用法和工作原理。

parseInt()函数可以将一个字符串转换为整数。它的语法如下:

----------------- -------

其中,string参数表示要进行转换的字符串,radix参数表示要使用的进制数。如果省略radix参数,则默认使用十进制。

例如,下面的代码将把字符串"10"转换成数值10

----- --- - -----
----- --- - --------------
----------------- -- -- --

如果我们明确指定要使用十六进制,则可以这样写:

----- --- - -----
----- --- - ------------- ----
----------------- -- -- ---

进制转换

在十进制数字系统中,每个位置上的数字的权值是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