我在JavaScript中有一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt
函数返回18
?
结果1/0
是Infinity
。
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。
以下是事件的顺序:
1/0
评估为Infinity
parseInt
阅读Infinity
并愉快地注意到I
以 19 为基数的 18parseInt
忽略字符串的其余部分,因为它无法转换。请注意,您会得到任何 base 的结果>= 19
,但不会得到低于该值的基数。对于 bases >= 24
,您将获得更大的结果,因为n
此时成为有效数字。
要添加到上述答案:
parseInt 旨在将字符串解析为数字(线索在名称中)。在您的情况下,您根本不想进行任何解析,因为 1/0已经是一个数字,所以这是一个奇怪的函数选择。如果您有一个数字(您有)并且想要将其转换为特定的基数,您应该使用带有基数的 toString来代替。
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”开始,它以I
19 为基数并转换为以 10 为基数的 18 然后它尝试获取下一个字符,即n
基数 19 中不存在的字符,因此丢弃下一个字符(根据 javascript 将字符串转换为数字的行为)
所以,如果你写parseInt("Infinity",19)
OR parseInt("I",19)
ORparseInt("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