Essayez d'exécuter ce qui suit en JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Je viens d'apprendre à la dure que JavaScript pense que le zéro de tête indique un entier octal , et puisqu'il n'y a pas "8"ou "9"en base-8, la fonction renvoie zéro. Qu'on le veuille ou non, c'est par conception .
Quelles sont les solutions de contournement?
Remarque: Par souci d'exhaustivité, je suis sur le point de publier une solution, mais c'est une solution que je déteste, alors veuillez publier d'autres / meilleures réponses.
Mettre à jour:
La 5e édition de la norme JavaScript ( ECMA-262 ) introduit un changement de rupture qui élimine ce comportement. Mozilla a une bonne rédaction .
10(décimal), sauf si le nombre à analyser est préfixé 0x, par exemple 0xFF, dans ce cas, le paramètre de base par défaut est 16. Espérons qu'un jour, ce problème sera un lointain souvenir.
+'08' === 8? Vrai! Peut-être avez-vous vraiment besoin parseIntde votre vrai code, mais pas de ce qui précède.
Number('08')
0ou undefinedet le numéro de la chaîne commence par un 0chiffre non suivi d'un xou X, alors l'implémentation peut, à sa discrétion, interpréter le nombre comme étant octal ou comme décimal. Les implémentations sont encouragées à interpréter les nombres dans ce cas comme étant décimaux. " ( mon accent)