协慌网

登录 贡献 社区

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

我在 JavaScript 中遇到了烦人的问题。

> parseInt(1 / 0, 19)
> 18

为什么parseInt返回18

答案

1/0的结果是Infinity

parseInt将其第一个参数视为字符串,这意味着首先调用Infinity.toString() ,生成字符串"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扫描输入"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"