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

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

> parseInt(1 / 0, 19)
> 18

为什么parseInt函数返回18

阳光神奇2020/03/10 10:35:22

这是事件的顺序:

  • 1/0 评估为 Infinity
  • parseInt读取Infinity并愉快地注意到I以19为底的18
  • parseInt 忽略字符串的其余部分,因为它无法转换。

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

小卤蛋村村2020/03/10 10:35:22

的结果1/0Infinity

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

以下是以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。

Gil村村2020/03/10 10:35:22

要添加到以上答案中:

parseInt旨在将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为1/0 已经是一个数字,因此这是一个奇怪的功能选择。如果您有一个数字(要执行此操作),并且想要将其转换为特定的底数,则应改用toString和基数

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