C'est quelque chose que les gens trébuchent tout le temps, même lorsqu'ils en ont connaissance. :-) Vous voyez ceci pour la même raison parseInt("1abc")
renvoie 1: parseInt
s'arrête au premier caractère invalide et renvoie tout ce qu'il a à ce point. S'il n'y a aucun caractère valide à analyser, il renvoie NaN
.
parseInt(8, 3)
signifie "analyser "8"
en base 3" (notez que cela convertit le nombre 8
en chaîne; détails dans la spécification ). Mais dans la base 3, les nombres à un chiffre sont juste 0
, 1
et 2
. C'est comme lui demander d'analyser "9"
en octal. Puisqu'il n'y avait aucun caractère valide, vous avez obtenu NaN
.
parseInt(16, 3)
lui demande d'analyser "16"
en base 3. Puisqu'il peut analyser le 1
, il le fait, puis il s'arrête au 6
car il ne peut pas l'analyser. Alors ça revient 1
.
Étant donné que cette question suscite beaucoup d'attention et pourrait être classée en bonne place dans les résultats de recherche, voici un aperçu des options de conversion de chaînes en nombres en JavaScript, avec leurs diverses particularités et applications (tirées d'une autre de mes réponses ici sur SO):
parseInt(str[, radix])
- Convertit autant que possible le début de la chaîne en un nombre entier (entier), en ignorant les caractères supplémentaires à la fin. Ainsi parseInt("10x")
est 10
; le x
est ignoré. Prise en charge un argument radix facultatif (base numérique), donc parseInt("15", 16)
est 21
( 15
en hexadécimal). S'il n'y a pas de base, suppose décimal, sauf si la chaîne commence par 0x
(ou 0X
), auquel cas il les ignore et prend hex. (Certains navigateurs utilisaient pour traiter les chaînes commençant par 0
octal; ce comportement n'a jamais été spécifié et a été spécifiquement interdit dans la spécification ES5.) Retourne NaN
si aucun chiffre analysable n'est trouvé.
parseFloat(str)
- Comme parseInt
, mais fait des nombres à virgule flottante et ne prend en charge que les nombres décimaux. Encore une fois sont ignorés, des caractères supplémentaires sur la chaîne parseFloat("10.5x")
est 10.5
(l' x
est ignorée). Comme seul le nombre décimal est pris en charge, parseFloat("0x15")
is 0
(car l'analyse se termine au x
). Renvoie NaN
si aucun chiffre analysable n'est trouvé.
Unaire +
, par exemple +str
- (Par exemple, conversion implicite) Convertit la chaîne entière en un nombre en utilisant la virgule flottante et la notation numérique standard de JavaScript (juste des chiffres et un point décimal = décimal; 0x
préfixe = hex; 0o
préfixe = octal [ES2015 +]; certaines implémentations l'étendent pour traiter un interligne 0
comme octal, mais pas en mode strict). +"10x"
est NaN
parce que le x
n'est pas ignoré. +"10"
est 10
, +"10.5"
est 10.5
, +"0x15"
est 21
, +"0o10"
est 8
[ES2015 +]. A un piège: +""
n'est 0
pas NaN
comme on pourrait s'y attendre.
Number(str)
- Exactement comme la conversion implicite (par exemple, comme l'unaire +
ci-dessus), mais plus lent sur certaines implémentations. (Non pas que cela ait de l'importance.)