为什么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"
    
    链接地址: http://www.djcxy.com/p/1309.html

    上一篇: Why does parseInt(1/0, 19) return 18?

    下一篇: Why does ++[[]][+[]]+[+[]] return the string "10"?