我在JavaScript中遇到一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt函数返回18?
我在JavaScript中遇到一个烦人的问题。
> parseInt(1 / 0, 19)
> 18
为什么parseInt函数返回18?
Answers:
的结果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。
parseInt('Infini',24)。
n也是一个有效数字,所以它实际上结束了parseInt("Infini", 24)。
这是事件的顺序:
1/0 评估为 InfinityparseInt读取Infinity并愉快地注意到I以19为底的18parseInt 忽略字符串的其余部分,因为它无法转换。请注意,您将获得任何基准的结果>= 19,但低于该基准的结果将不会。对于base >= 24,您会得到更大的结果,因为这n将成为有效数字。
parseInt是36,因为英文字母中有26个字母,并且约定是使用数字,然后使用字母作为给定基数中的有效数字集。
Infinity为"Infinity"...
要添加以上答案:
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)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
即
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
if可能会有所帮助。