Intente ejecutar lo siguiente 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 !!
Acabo de enterarme por completo que JavaScript cree que el cero inicial indica un número entero octal , y dado que no existe "8"
o "9"
en base-8, la función devuelve cero. Nos guste o no, esto es por diseño .
¿Cuáles son las soluciones alternativas?
Nota: En aras de la exhaustividad, estoy a punto de publicar una solución, pero es una solución que odio, así que publique otras / mejores respuestas.
Actualizar:
La quinta edición del estándar JavaScript ( ECMA-262 ) introduce un cambio radical que elimina este comportamiento. Mozilla tiene una buena reseña .
javascript
integer
octal
Portman
fuente
fuente
10
(decimal) a menos que el número a analizar tenga como prefijo0x
, por ejemplo0xFF
, en cuyo caso el parámetro base predeterminado es 16. Esperemos que algún día este problema Será un recuerdo lejano.+'08' === 8
? ¡Cierto! Tal vez realmente necesitesparseInt
tu código real, pero no para lo anterior.Number('08')
0
oundefined
y el número de la cadena empieza con un0
dígito no seguida de unax
oX
, a continuación, la aplicación puede, a su discreción, interpretar el número, ya sea como octal o como decimal. se anima a las implementaciones de interpretar los números en este caso como decimal. " ( mi énfasis)Respuestas:
Este es un problema común de Javascript con una solución simple:
Simplemente especifique la base , o 'radix', así:
También puedes usar Número :
fuente
Si sabe que su valor estará en el rango entero de 32 bits con signo, entonces
~~x
hará lo correcto en todos los escenarios.Si busca binary not (
~
), la especificación requiere una conversión "ToInt32" para el argumento que realiza la conversión obvia a Int32 y se especifica para obligar a losNaN
valores a cero.Sí, esto es increíblemente hack pero es muy conveniente ...
fuente
De la documentación de parseInt , use el argumento de la raíz opcional para especificar base-10:
Esto me parece pedante, confuso y detallado (¿realmente, un argumento adicional en cada análisis?), Así que espero que haya una mejor manera.
fuente
parseInt
para un uso conveniente en expresiones funcionales, comomap
en["7","4","09","5"].map(parseInt);
Map
pasará el índice del elemento en la matriz como el segundo argumento, que será interpretadoparseInt
como la base a menos que lo ajuste.editar: hacer su propia función, hacer lo que realmente quiere, es solo una opción si no le gusta agregar ", 10" todo el tiempo a la llamada parseInt (). Tiene la desventaja de ser una función no estándar: más conveniente para usted si la usa mucho, pero quizás más confusa para otros.
fuente
Especifique la base:
fuente
¿Sería muy malo reemplazar parseInt con una versión que asume decimal si no tiene un segundo parámetro? (nota - no probado)
fuente
parseInt("0xFFFFFF") === 16777215
pero con tu truco travieso ya no funcionaparseInt("0xFFFFFF") === 0
y por si acaso
MDN Link
fuente
¿Qué tal esto para decimal:
fuente
Si ya ha realizado una gran cantidad de codificación con parseInt y no desea agregar ", 10" a todo, puede anular la función para que la base 10 sea la predeterminada:
Eso puede confundir a un lector posterior, por lo que hacer una función parseInt10 () podría explicarse más por sí mismo. Personalmente, prefiero usar una función simple que tener que agregar ", 10" todo el tiempo, solo crea más oportunidades para errores.
fuente
Este problema no se puede replicar en las últimas Chrome ni Firefox (2019).
fuente