863

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

> parseInt(1 / 0, 19)
> 18

为什么parseInt函数返回18

4

4 回答 4

1305

结果1/0Infinity

parseInt将它的第一个参数视为一个字符串,这意味着首先Infinity.toString()被调用,产生字符串"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。

于 2012-07-05T08:41:49.153 回答
229

以下是事件的顺序:

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

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

于 2012-07-05T08:43:38.050 回答
39

要添加到上述答案:

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

var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
于 2012-07-10T15:54:51.230 回答
14

添加到上述答案

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

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

所以,如果你写parseInt("Infinity",19)OR parseInt("I",19)ORparseInt("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

IE

  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
于 2012-07-17T08:01:49.687 回答