JSLint dice "falta el parámetro de la raíz"

538

Ejecuté JSLint en este código JavaScript y decía:

Problema en la línea 32, carácter 30: Falta el parámetro de la raíz.

Este es el código en cuestión:

imageIndex = parseInt(id.substring(id.length - 1))-1;

¿Que esta mal aquí?

Mike Vierwind
fuente

Respuestas:

967

Siempre es una buena práctica pasar radix con parseInt -

parseInt(string, radix)

Para decimal -

parseInt(id.substring(id.length - 1), 10)

Si se omite el parámetro radix, JavaScript asume lo siguiente:

  • Si la cadena comienza con "0x", la raíz es 16 (hexadecimal)
  • Si la cadena comienza con "0", la raíz es 8 (octal). Esta característica está en desuso
  • Si la cadena comienza con cualquier otro valor, la raíz es 10 (decimal)

( Referencia )

Jayendra
fuente
77
Por lo que parece, el valor predeterminado es 10. Si no comienza con 0x o 0, el valor predeterminado es una raíz de 10. Pero es una buena práctica especificar una raíz incluso si es el valor predeterminado, algo así como especificando la definición de "esto" a una función array.map.
molson504x
81
eso es tan irracional ... según esa lógica, debería haber un tercer parámetro para representar la raíz del argumento de la raíz misma
Nishant
66
De acuerdo con otros comentaristas. ¿Por qué es bueno proporcionar un valor de raíz cuando el valor predeterminado es 10? Esto desafía las convenciones comunes.
Richard Clayton
99
Agregue 10 como la raíz para obtener otro error de pelusa ...Redundant radix parameter
Shanimal
2
@Nishant: el radixargumento es un valor numérico, no una representación de cadena de un valor numérico, por lo que no hay una raíz para especificar.
tokland
79

Para evitar esta advertencia, en lugar de usar:

parseInt("999", 10);

Puede reemplazarlo por:

Number("999");


Tenga en cuenta que parseInt y Number tienen comportamientos diferentes , pero en algunos casos, uno puede reemplazar al otro.

Zanon
fuente
44
También hay grandes diferencias de rendimiento entre parseInty Number. Aquí hay una vieja prueba de rendimiento .
Josh Unger
3
Chrome 77: Number()es 6 veces más rápido queparseInt()
Zanon el
1
Esta es una solución limpia que funciona bien.
thanos.a
43

No estoy respondiendo correctamente la pregunta, pero creo que tiene sentido aclarar por qué deberíamos especificar la raíz .

En la documentación de MDN podemos leer que:

Si la raíz está indefinida o 0 (o ausente), JavaScript asume lo siguiente:

  • [...]
  • Si la cadena de entrada comienza con "0", la raíz es ocho (octal) o 10 (decimal). Exactamente qué radix se elige depende de la implementación. ECMAScript 5 especifica que se usa 10 (decimal), pero aún no todos los navegadores lo admiten. Por esta razón, siempre especifique una raíz cuando use parseInt.
  • [...]

Fuente: MDN parseInt ()

nmoliveira
fuente
1
Sí, pero el compilador mecanografiado lo insertará, entonces, ¿por qué debería molestarse?
Spock
2
@Spock Porque TSLint se queja de que no está allí. Y vamos por la madriguera del conejo ...
msanford
Sí, es cierto ... por eso solo desactivo esta regla de pelusa. Todavía no entiendo por qué un parámetro OPCIONAL dispara una queja de pelusa ... bueno
Spock el
44
@Spock Especifique siempre este parámetro para eliminar la confusión del lector y garantizar un comportamiento predecible. Las diferentes implementaciones producen resultados diferentes cuando no se especifica una raíz, por lo general, el valor predeterminado es 10. Referencia
Andrew Lam
27

Puede desactivar esta regla si desea omitir esa prueba.

Insertar:

radix: false

Debajo de la rulespropiedad " " en el tslint.jsonarchivo.

No se recomienda hacer eso si no comprende esta excepción.

Spock
fuente
1
Voy a usar esto ya que el código funciona bien sin radix
William
22

Agregar lo siguiente en la parte superior de su archivo JS le indicará a JSHint que suprima la advertencia de radix:

/*jshint -W065 */

Ver también: http://jshint.com/docs/#options

aleemb
fuente
2
¿A qué opción jshint corresponde esto? Estoy usando SublimeLint para ejecutar jshint en mi editor, y solo requiere un hash de opción: pares de valores para su configuración, por lo que no creo que pueda aplicar su sugerencia "-W065".
Dihedral
55
Puede usar "-W065": true, por ejemplo, en un .jshintrcarchivo.
alexfernandez
29
-1 Por favor, no hagas esto, solo agrega la raíz que deseas analizar
Juan Mendes
Cuanto más tipeado sea un lenguaje, más oportunidades tendrá para la optimización del compilador, por lo que arroja la advertencia.
HoldOffHunger
3
en el JS moderno, la OMI que agrega la raíz hace que no esté claro qué está haciendo la función. Está en la posición en la que puede esperar un valor predeterminado si no conoce la firma de la función. No tiene sentido que tenga que especificar una raíz.
Charles Offenbacher
5

Lo resolví simplemente usando el + foo, para convertir la cadena.

Tenga en cuenta que no es bueno para la legibilidad (corrección sucia).

console.log( +'1' )
// 1 (int)
user2369834
fuente
3

También puede simplemente agregar esta línea justo encima de su línea parseInt:

// eslint-disable-next-line

Esto deshabilitará la comprobación de eslint para la siguiente línea. Use esto si solo necesita omitir una o dos líneas.

Rohit Nethi
fuente
2

Simplemente coloque una cadena vacía en el lugar de la raíz, porque parseInt () toma dos argumentos:

parseInt (string, radix);

string El valor a analizar. Si el argumento de cadena no es una cadena, entonces se convierte en una cadena (usando la operación abstracta ToString). Los espacios en blanco iniciales en el argumento de cadena se ignoran.

radix Un número entero entre 2 y 36 que representa la raíz (la base en los sistemas de numeración matemática) de la cadena mencionada anteriormente. Especifique 10 para el sistema de numeración decimal comúnmente utilizado por los humanos. Siempre especifique este parámetro para eliminar la confusión del lector y garantizar un comportamiento predecible. Las diferentes implementaciones producen resultados diferentes cuando no se especifica una raíz, por lo general, el valor predeterminado es 10.

imageIndex = parseInt (id.substring (id.length - 1)) - 1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;

Ahmed.Dz
fuente
2

Simplemente agregue su regla personalizada en .eslintrc que se ve así "radix": "off" y estará libre de esta advertencia de falta de seguridad. Esto es para el eslint linter.

Goran_Ilic_Ilke
fuente
1

Antes de ECMAScript 5, parseInt () también autodetectaba los literales octales, lo que causaba problemas porque muchos desarrolladores suponían que se ignoraría un 0 inicial.

Entonces, en lugar de:

var num = parseInt("071");      // 57

Hacer esto:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

Referencia

SanTom
fuente
0

En lugar de llamar a la substringfunción que podrías usar.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

Aquí, -1 en el segmento indica que para iniciar el segmento desde el último índice.

Gracias.

Daniel
fuente