我在 JavaScript 中有一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么 parseInt
函数返回 18
?
if
可能会有所帮助。
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 计算为无穷大
parseInt 读取 Infinity 并高兴地注意到我是 18 在基数 19
parseInt 忽略字符串的其余部分,因为它不能被转换。
请注意,您会得到任何基数 >= 19
的结果,但不会得到低于此值的基数。对于基数 >= 24
,您将获得更大的结果,因为此时 n
成为有效数字。
parseInt
将接受的最大基数是 36,因为英文字母表中有 26 个字母,并且约定是使用数字然后字母作为给定基数中的有效数字集。
Infinity
更改为 "Infinity"
...
parseInt
需要一个字符串作为其第一个参数,因此 Infinity
被强制为 "Infinity"
;这也应该是一个有序列表,而不是无序列表。但是接受的答案已经解释了一切……
要添加到上述答案:
parseInt 旨在将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为 1/0 已经 是一个数字,所以这是一个奇怪的函数选择。如果您有一个数字(您有)并且想要将其转换为特定的基数,则应使用 toString with a radix 代替。
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
添加到上述答案
parseInt(1/0,19)
等同于 parseInt("Infinity",19)
基数为 19 的数字 0-9
和 A-I
(or a-i)
是有效数字。因此,从“Infinity”开始,它需要以 19 为底的 I
并转换为以 10 为底的 18,然后它会尝试获取下一个字符,即 n
,它在 19 进制中不存在,因此丢弃下一个字符(根据 javascript 的将字符串转换为数字的行为)
因此,如果您编写 parseInt("Infinity",19)
OR parseInt("I",19)
OR parseInt("i",19)
,结果将相同,即 18
。
现在,如果你写 parseInt("I0",19)
,结果将是 342
,因为 I 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
parseInt('Infini',24)
。n
也是一个有效数字,所以它实际上最终会执行parseInt("Infini", 24)
。