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.)