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

我在javascript中遇到了一个烦人的问题。

> parseInt(1 / 0, 19)> 18

为什么parseInt函数返回18

58687 次浏览

1/0的结果是Infinity

parseInt将其第一个参数视为字符串,这意味着首先调用Infinity.toString(),生成字符串"Infinity"。因此,它的工作原理与您要求它将基数为19的"Infinity"转换为十进制相同。

以下是以19为基数的数字及其十进制值:

Base 19   Base 10 (decimal)---------------------------0            01            12            23            34            45            56            67            78            89            9a            10b            11c            12d            13e            14f            15g            16h            17i            18

接下来发生的事情是parseInt扫描输入"Infinity"以查找可以解析的部分,并在接受第一个I后停止(因为n在基数19中不是有效数字)。

因此,它的行为就像您调用parseInt("I", 19)一样,它通过上表转换为十进制18。

以下是事件的顺序:

  • 1/0计算为Infinity
  • parseInt读取Infinity并高兴地注意到I在基数19中是18
  • parseInt忽略字符串的其余部分,因为它无法转换。

请注意,您会得到任何基数>= 19的结果,但不会得到低于该基数的结果。对于基数>= 24,您将获得更大的结果,因为n在该点成为有效数字。

为了补充上述答案:

parseInt旨在将字符串解析为数字(线索就在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0是已经一个数字,所以它是一个奇怪的函数选择。如果您有一个数字(您有)并想将其转换为特定的基数,您应该使用toString的基数代替。

var num = 1 / 0;var numInBase19 = num.toString(19); // returns the string "Infinity"

为了补充以上的答案

parseInt(1/0,19)等于parseInt("Infinity",19)

在以19为基数的数字中,0-9A-I(or a-i)是有效的数字。因此,从“无穷大”开始,它取19为基数的I并转换为基数10,变为18然后它尝试获取下一个字符,即n,它不存在于基数19中,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为)

所以,如果你写parseInt("Infinity",19)parseInt("I",19)parseInt("i",19),结果将是相同的,即18

现在,如果你写parseInt("I0",19),结果将是342I X 19 (the base)^1 + 0 X 19^0=18 X 19^1 + 0 X 19^0=18 X 19 + 0 X 1=342

类似地,parseInt("I11",19)将导致6518

  18 X 19^2  +   1 X 19^1   +  1 X 19^0= 18 X 19^2  +   1 X 19^1   +  1 X 19^0= 18 X 361   +   1 X 19     +  1 X 1= 6498  +  19  +  1= 6518