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 parseInt
de votre vrai code, mais pas de ce qui précède.
Number('08')
0
ou undefined
et le numéro de la chaîne commence par un 0
chiffre non suivi d'un x
ou 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)