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: parseInts'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 8en chaîne; détails dans la spécification ). Mais dans la base 3, les nombres à un chiffre sont juste 0, 1et 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 6car 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 xest ignoré. Prise en charge un argument radix facultatif (base numérique), donc parseInt("15", 16)est 21( 15en 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 0octal; ce comportement n'a jamais été spécifié et a été spécifiquement interdit dans la spécification ES5.) Retourne NaNsi 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' xest ignorée). Comme seul le nombre décimal est pris en charge, parseFloat("0x15")is 0(car l'analyse se termine au x). Renvoie NaNsi 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; 0xpréfixe = hex; 0opréfixe = octal [ES2015 +]; certaines implémentations l'étendent pour traiter un interligne 0comme octal, mais pas en mode strict). +"10x"est NaNparce que le xn'est pas ignoré. +"10"est 10, +"10.5"est 10.5, +"0x15"est 21, +"0o10"est 8[ES2015 +]. A un piège: +""n'est 0pas NaNcomme 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.)