J'ai un problème ennuyeux en JavaScript.
> parseInt(1 / 0, 19)
> 18
Pourquoi la fonction parseInt
renvoie-t-elle 18
?
Le résultat de 1/0
est Infinity
.
parseInt
traite son premier argument comme une chaîne, ce qui signifie tout d'abord que Infinity.toString()
est appelée, produisant la chaîne "Infinity"
. Donc, cela fonctionne comme si vous lui demandiez de convertir "Infinity"
en base 19 en décimal.
Voici les chiffres en base 19 avec leurs valeurs décimales:
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
Ce qui se passe ensuite, c’est que parseInt
analyse l’entrée "Infinity"
pour trouver quelle partie de celle-ci peut être analysée et s’arrête après avoir accepté le premier I
(car n
n’est pas un chiffre valide en base 19).
Par conséquent, il se comporte comme si vous appeliez parseInt("I", 19)
, ce qui convertit le nombre décimal 18 par le tableau ci-dessus.
Voici la séquence des événements:
1/0
est évalué à Infinity
parseInt
lit Infinity
et note heureusement que I
est égal à 18 en base 19parseInt
ignore le reste de la chaîne, car elle ne peut pas être convertie.Notez que vous obtiendrez un résultat pour toute base >= 19
, mais pas pour les bases inférieures. Pour les bases >= 24
, vous obtiendrez un résultat plus grand, car n
deviendra un chiffre valide à cet endroit.
Pour ajouter aux réponses ci-dessus:
parseInt est destiné à analyser les chaînes en nombres (l'indice est dans le nom). Dans votre cas, vous ne voulez pas du tout analyser du tout, car 1/0 est déjà un nombre, donc c'est un choix de fonction étrange. Si vous avez un numéro (que vous avez) et que vous voulez le convertir en une base particulière, vous devez utiliser toString avec une base à la place.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Pour ajouter aux réponses ci-dessus
parseInt(1/0,19)
est équivalent à parseInt("Infinity",19)
Dans la base 19, les chiffres 0-9
et A-I
(or a-i)
sont des nombres valides. Ainsi, à partir de "l'infini", il prend I
de la base 19 et est converti en base 10, ce qui donne 18 ans. Il tente ensuite de prendre le caractère suivant, c'est-à-dire n
, qui n'est pas présent en base 19; (selon le comportement de javascript consistant à convertir une chaîne en nombre)
Ainsi, si vous écrivez parseInt("Infinity",19)
OR parseInt("I",19)
OR parseInt("i",19)
, le résultat sera le même, c'est-à-dire 18
.
Maintenant, si vous écrivez parseInt("I0",19)
, le résultat sera 342
comme 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
De même, parseInt("I11",19)
donnera 6518
c'est à dire.
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