我在JavaScript中遇到了烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt
函数返回18
?
答案 0 :(得分:1283)
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 :(得分:224)
以下是事件的顺序:
1/0
评估为Infinity
parseInt
读取Infinity
,并高兴地注意到I
在基数为19时为18 parseInt
忽略字符串的其余部分,因为它无法转换。请注意,您会获得任何基础>= 19
的结果,但不会获得低于此基数的基数。对于基数>= 24
,您会得到更大的结果,因为n
在此时成为有效数字。
答案 2 :(得分:37)
要添加上述答案:
parseInt旨在将字符串解析为数字(名称中的线索)。在你的情况下,你根本不想进行任何解析,因为1/0 已经一个数字,所以这是一个奇怪的功能选择。如果您有一个号码(您这样做)并希望将其转换为特定的号码,则应使用toString with a radix代替。
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
答案 3 :(得分:13)
添加上述答案
parseInt(1/0,19)
相当于parseInt("Infinity",19)
在19个基数中,0-9
和A-I
(or a-i)
是有效数字。因此,从“无限”开始,它需要基数19的I
并转换为基数10,它变为18
然后它尝试获取下一个字符,即基数19中不存在的n
,因此丢弃下一个字符(根据javascript将字符串转换为数字的行为)
所以,如果你写parseInt("Infinity",19)
或parseInt("I",19)
或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
即。
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