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 .
javascript
integer
octal
Portman
la source
la source
10
(décimal), sauf si le nombre à analyser est préfixé0x
, par exemple0xFF
, 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 besoinparseInt
de votre vrai code, mais pas de ce qui précède.Number('08')
0
ouundefined
et le numéro de la chaîne commence par un0
chiffre non suivi d'unx
ouX
, 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)Réponses:
Il s'agit d'un gotcha Javascript commun avec une solution simple:
Spécifiez simplement la base , ou «radix», comme ceci:
Vous pouvez également utiliser Numéro :
la source
Si vous savez que votre valeur sera dans la plage d'entiers 32 bits signée, alors
~~x
fera la bonne chose dans tous les scénarios.Si vous recherchez binaire not (
~
), la spécification nécessite une conversion "ToInt32" pour l'argument qui effectue la conversion évidente en Int32 et est spécifié pour contraindre lesNaN
valeurs à zéro.Oui, c'est incroyablement hackish mais c'est tellement pratique ...
la source
Dans la documentation de parseInt , utilisez l'argument radix facultatif pour spécifier la base-10:
Cela me semble pédant, déroutant et verbeux (vraiment, un argument supplémentaire dans chaque analyse individuelle?), Donc j'espère qu'il y a une meilleure façon.
la source
parseInt
pour une utilisation pratique dans les expressions fonctionnelles, commemap
dans["7","4","09","5"].map(parseInt);
Map
passera l' index de l'élément dans le tableau comme deuxième argument, qui sera interprétéparseInt
comme la base à moins que vous ne l'utilisiez.edit: créer votre propre fonction, pour faire ce que vous voulez vraiment, n'est qu'une option si vous n'aimez pas ajouter tout le temps ", 10" à l'appel parseInt (). Il a l'inconvénient d'être une fonction non standard: plus pratique pour vous si vous l'utilisez beaucoup, mais peut-être plus déroutant pour les autres.
la source
Spécifiez la base:
la source
Serait-il très vilain de remplacer parseInt par une version qui prend la décimale si elle n'a pas de second paramètre? (note - non testé)
la source
parseInt("0xFFFFFF") === 16777215
:, mais avec votre hack méchant en place, cela ne fonctionne plusparseInt("0xFFFFFF") === 0
et pour faire bonne mesure
Lien MDN
la source
Que diriez-vous pour décimal:
la source
Si vous avez déjà fait beaucoup de codage avec parseInt et que vous ne voulez pas ajouter ", 10" à tout, vous pouvez simplement remplacer la fonction pour faire de la base 10 la valeur par défaut:
Cela peut dérouter un lecteur ultérieur, donc faire une fonction parseInt10 () pourrait être plus explicite. Personnellement, je préfère utiliser une fonction simple que d'avoir à ajouter ", 10" tout le temps - crée simplement plus de possibilités d'erreurs.
la source
Ce problème ne peut pas être répliqué dans les derniers Chrome ni Firefox (2019).
la source