J'ai un problème gênant en JavaScript .
> parseInt(1 / 0, 19)
> 18
Pourquoi la parseInt
fonction revient-elle 18
?
javascript
parseint
cebor
la source
la source
if
pourrait aider.Réponses:
Le résultat de
1/0
estInfinity
.parseInt
traite son premier argument comme une chaîne, ce qui signifie que tout d'abordInfinity.toString()
est appelé, produisant la chaîne"Infinity"
. Il fonctionne donc de la même manière que si vous lui aviez demandé de convertir"Infinity"
en base 19 en décimal.Voici les chiffres de la base 19 avec leurs valeurs décimales:
Ce qui se passe ensuite est que
parseInt
balaye l'entrée"Infinity"
pour trouver quelle partie de celle-ci peut être analysée et s'arrête après avoir accepté le premierI
(car cen
n'est pas un chiffre valide dans la base 19).Par conséquent, il se comporte comme si vous appeliez
parseInt("I", 19)
, ce qui se transforme en décimal 18 par le tableau ci-dessus.la source
parseInt('Infini',24)
.n
est également un chiffre valide, il finit par le faireparseInt("Infini", 24)
.Voici la séquence des événements:
1/0
évalue àInfinity
parseInt
litInfinity
et note avec bonheur quiI
est de 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 n'importe quelle base
>= 19
, mais pas pour les bases en dessous. Pour les bases>= 24
, vous obtiendrez un résultat plus grand, car iln
devient un chiffre valide à ce stade.la source
parseInt
acceptera est 36, car il y a 26 lettres dans l'alphabet anglais, et la convention est d'utiliser des chiffres puis des lettres comme ensemble de chiffres valides dans la base donnée.Infinity
à"Infinity"
...Pour ajouter aux réponses ci-dessus:
parseInt est destiné à analyser les chaînes en nombres (l'indice est dans le nom). Dans votre situation, vous ne voulez pas du tout analyser car 1/0 est déjà un nombre, c'est donc un choix de fonction étrange. Si vous avez un nombre (ce que vous faites) et que vous souhaitez le convertir en une base particulière, vous devez plutôt utiliser toString avec un radix .
la source
Pour ajouter aux réponses ci-dessus
parseInt(1/0,19)
est équivalent àparseInt("Infinity",19)
Dans la base 19 numéros
0-9
etA-I
(or a-i)
sont des numéros valides. Donc, à partir de "l'infini", il prendI
de la base 19 et se convertit en base 10 qui devient 18 Ensuite, il essaie de prendre le caractère suivant, c'est-à-diren
qui n'est pas présent en base 19, donc il rejette les caractères suivants (selon le comportement de javascript de la conversion de la chaîne en nombre )Donc, si vous écrivez
parseInt("Infinity",19)
OUparseInt("I",19)
OUparseInt("i",19)
le résultat sera le même, c'est-à-dire18
.Maintenant, si vous écrivez,
parseInt("I0",19)
le résultat sera342
commeI 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)
entraînera6518
c'est à dire
la source