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

我有一个恼人的JavaScript问题。

> parseInt(1 / 0, 19) > 18 

为什么parseInt返回18

1/0的结果是Infinity

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

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

 Base 19 Base 10 (decimal) --------------------------- 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 a 10 b 11 c 12 d 13 e 14 f 15 g 16 h 17 i 18 

接下来发生的事情是, parseInt扫描input"Infinity" ,find哪个部分可以被parsing,并在接受第一个I (因为n不是基数19中的有效数字)后停止。

因此,它的行为就像调用parseInt("I", 19) ,它可以通过上面的表格转换成十进制数字18。

以下是事件的顺序:

  • 1/0评估为Infinity
  • parseInt读取Infinity并高兴地注意到, I在基数19是18
  • parseInt忽略了string的其余部分,因为它不能被转换。

请注意,你会得到任何基地>= 19 ,但不是以下的基地。 对于>= 24碱基,你会得到一个更大的结果,因为n成为这个点上的有效数字。

要添加到上面的答案:

parseInt旨在将stringparsing为数字(线索在名称中)。 在你的情况下,你根本不想做任何parsing,因为1/0 已经是一个数字,所以这是一个奇怪的functionselect。 如果你有一个数字(你这样做)并且想把它转换成一个特定的基础,你应该用一个基数来代替toString 。

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

添加到上面的答案

parseInt(1/0,19)相当于parseInt("Infinity",19)

在19位数字中, 0-9AI (or ai)是有效的数字。 所以,从“无穷大”中, I需要基数为19,并转换为基数10,它变成18然后它尝试采取下一个字符,即基数19中不存在的n ,所以丢弃下一个字符(根据javascript的转换string的行为号码)

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

现在,如果你写了parseInt("I0",19)那么结果将是342 IX 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