194 votes

Pourquoi est-ce que parseInt (8,3) == NaN et parseInt (16,3) == 1?

Je suis en train de lire ceci , mais je suis confus par ce qui est écrit dans le parseInt avec un radix argument chapitre

table of parseInt(_, 3) outcomes

Pourquoi est-ce que parseInt(8, 3)NaN et parseInt(16, 3)1?

Autant que je sache, 8 et 16 ne sont pas de base-3 numéros, parseInt(16, 3) doit renvoyer NaN trop

the first ten base-3 natural numbers

377voto

T.J. Crowder Points 285826

C'est quelque chose que les gens du voyage sur tous les temps, même quand ils savent à ce sujet. :-) Vous voyez ce pour la même raison, parseInt("1abc") retourne 1: parseInt s'arrête au premier caractère non valide et renvoie ce qu'elle a à ce point. Si il n'y a aucun des caractères valides pour analyser, il retourne NaN.

parseInt(8, 3) signifie "parse "8" en base 3" (notez qu'il convertit le nombre 8 d'une chaîne de caractères; les détails dans la spec). Mais dans la base de 3, les chiffres sont juste 0, 1, et 2. C'est comme demander à analyser "9" en octal. Puisqu'il n'y avait pas de caractères valides, vous avez obtenu NaN.

parseInt(16, 3) est demandé à analyser "16" en base 3. Depuis qu'il peut analyser l' 1, il le fait, et puis il s'arrête à l' 6 car il ne peut pas l'analyser. On en revient donc 1.


Depuis que cette question est l'objet de beaucoup d'attention et pourrait figurer en bonne position dans les résultats de recherche, voici un aperçu des options pour convertir des chaînes en nombres dans JavaScript, avec leurs différentes caractéristiques et applications (levée d'une autre réponse de la mienne ici):

  • parseInt(str[, radix]) - Convertit autant de début de la chaîne comme il peut dans un entier (integer), en ignorant les caractères supplémentaires à la fin. Donc, parseInt("10x") est 10; x est ignoré. Prend en charge une option de base (nombre de base) argument, parseInt("15", 16) est 21 (15 en hexadécimal). Si il n'y a pas de radix, qui assume la virgule, sauf si la chaîne commence par 0x (ou 0X), auquel cas il ignore ceux et suppose hex. (Certains navigateurs utilisés pour traiter les chaînes de caractères commençant par 0 comme octal; que le comportement n'a jamais été spécifié, et a été spécifiquement rejetée dans l'ES5 cahier des charges.) Les retours NaN si pas de parseable chiffres sont trouvés.

  • parseFloat(str) Comme parseInt, mais ne les nombres à virgule flottante et prend en charge uniquement décimal. Encore des caractères supplémentaires sur la chaîne sont pas pris en compte, parseFloat("10.5x") est 10.5 ( x est ignoré). Comme seule décimale est pris en charge, parseFloat("0x15") est 0 (car l'analyse se termine à l' x). Les retours NaN si pas de parseable chiffres sont trouvés.

  • Unaire +, par exemple, +str - (E. g., la conversion implicite) Convertit l' ensemble de la chaîne en nombre à l'aide de nombres à virgule flottante et JavaScript standard de notation des nombres (juste des chiffres et point décimal = décimal; 0x prefix = hex; 0o prefix = octal [ES2015+]; certaines implémentations de l'étendre à traiter l'un des leaders 0 comme octal, mais pas en mode strict). +"10x" est NaN parce que l' x est pas ignoré. +"10" est 10, +"10.5" est 10.5, +"0x15" est 21, +"0o10" est 8 [ES2015+]. A un gotcha: +"" est 0, pas NaN comme vous vous en doutez.

  • Number(str) - Exactement comme la conversion implicite (par exemple, comme le unaire + ci-dessus), mais plus lent sur certaines implémentations. (Pas qu'il est probable qu'à la matière.)

54voto

njzk2 Points 17085

Pour la même raison que

>> parseInt('1foobar',3)
<- 1

Dans la doc, parseInt prend une chaîne de caractères. Et

Si la chaîne n'est pas une chaîne, puis il est converti en une chaîne de caractères

Donc, 16, 8ou '1foobar' est d'abord converti en chaîne de caractères.

Alors

Si parseInt rencontre un personnage qui n'est pas un chiffre dans la base, il l'ignore et réussir tous les personnages

Le sens qu'il convertit jusqu'à l'endroit où il peut. L' 6, 8, et foobar sont ignorés, et que ce qui est avant est converti. Si il n'y a rien, NaN est retourné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X