JSLint dit «paramètre radix manquant»

538

J'ai exécuté JSLint sur ce code JavaScript et il a dit:

Problème à la ligne 32, caractère 30: paramètre radix manquant.

Voici le code en question:

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

Qu'est-ce qui ne va pas ici?

Mike Vierwind
la source

Réponses:

967

C'est toujours une bonne pratique de passer radix avec parseInt -

parseInt(string, radix)

Pour décimal -

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

Si le paramètre radix est omis, JavaScript suppose ce qui suit:

  • Si la chaîne commence par "0x", le radix est 16 (hexadécimal)
  • Si la chaîne commence par "0", le radix est 8 (octal). Cette fonctionnalité est déconseillée
  • Si la chaîne commence par une autre valeur, le radix est 10 (décimal)

( Référence )

Jayendra
la source
7
D'après les sons de celui-ci, la valeur par défaut est 10. Si elle ne commence pas par 0x ou 0, elle vaut par défaut un radix de 10. Mais il est préférable de spécifier un radix même s'il s'agit de la valeur par défaut, un peu comme spécifiant la définition de "this" à une fonction array.map.
molson504x
81
c'est tellement déraisonnable ... selon cette logique, il devrait y avoir un troisième paramètre pour représenter la radix de l'argument radix lui
Nishant
6
D'accord avec d'autres commentateurs. Pourquoi est-il bon de fournir une valeur radix lorsque la valeur par défaut est 10? Cela défie la convention commune.
Richard Clayton
9
Ajoutez 10 comme radix pour obtenir une autre erreur de peluches ...Redundant radix parameter
Shanimal
2
@Nishant: L' radixargument est une valeur numérique, pas une représentation sous forme de chaîne d'une valeur numérique, il n'y a donc pas de radix à spécifier.
tokland
79

Pour éviter cet avertissement, au lieu d'utiliser:

parseInt("999", 10);

Vous pouvez le remplacer par:

Number("999");


Notez que parseInt et Number ont des comportements différents , mais dans certains cas, l'un peut remplacer l'autre.

Zanon
la source
4
Il existe également de grandes différences de performances entre parseIntet Number. Voici un ancien test de performance .
Josh Unger
3
Chrome 77: Number()6 fois plus rapide queparseInt()
Zanon
1
C'est une solution propre qui fonctionne très bien.
thanos.a
43

Je ne réponds pas correctement à la question, mais je pense qu'il est logique de préciser pourquoi nous devrions spécifier la radix .

Sur la documentation MDN, nous pouvons lire que:

Si radix n'est pas défini ou 0 (ou absent), JavaScript suppose ce qui suit:

  • [...]
  • Si la chaîne d'entrée commence par "0", le radix est huit (octal) ou 10 (décimal). Le radix choisi dépend de l'implémentation. ECMAScript 5 spécifie que 10 (décimal) est utilisé, mais tous les navigateurs ne le prennent pas encore en charge. Pour cette raison, spécifiez toujours un radix lorsque vous utilisez parseInt.
  • [...]

Source: MDN parseInt ()

nmoliveira
la source
1
Oui mais le compilateur Typescript l'insérera, alors pourquoi devriez-vous vous embêter?
Spock
2
@Spock Parce que TSLint se plaint qu'il n'est pas là. Et dans le
terrier
Oui, c'est vrai ... c'est pourquoi je viens de désactiver cette règle sur les peluches. Je ne comprends toujours pas pourquoi un paramètre OPTIONNEL déclenche une plainte contre les peluches .. eh bien
Spock
4
@Spock Spécifiez toujours ce paramètre pour éliminer la confusion du lecteur et garantir un comportement prévisible. Différentes implémentations produisent des résultats différents lorsqu'une base n'est pas spécifiée, la valeur par défaut étant généralement de 10. Référence
Andrew Lam
28

Vous pouvez désactiver cette règle si vous souhaitez ignorer ce test.

Insérer:

radix: false

Sous la rulespropriété " " du tslint.jsonfichier.

Il n'est pas recommandé de le faire si vous ne comprenez pas cette exception.

Spock
la source
1
Je vais l'utiliser car le code fonctionne très bien sans radix
William
22

L'ajout de ce qui suit en haut de votre fichier JS indiquera à JSHint de supprimer l'avertissement Radix:

/*jshint -W065 */

Voir aussi: http://jshint.com/docs/#options

aleemb
la source
2
À quelle option jshint cela correspond-il? J'utilise SublimeLint pour exécuter jshint dans mon éditeur, et cela ne prend qu'une option de hachage: des paires de valeurs pour son paramètre, donc je ne pense pas pouvoir appliquer votre suggestion "-W065".
Dihedral
5
Vous pouvez utiliser "-W065": true, par exemple dans un .jshintrcfichier.
alexfernandez
29
-1 S'il vous plaît ne faites pas cela, ajoutez simplement la radix dans laquelle vous souhaitez analyser
Juan Mendes
Plus un langage est typé fortement, plus il y a de possibilités d'optimisation du compilateur, c'est pourquoi il lance l'avertissement.
HoldOffHunger
3
dans JS moderne, IMO ajouter le radix rend en fait plus flou ce que fait la fonction. C'est dans la position que vous pourriez attendre d'un défaut si vous ne connaissez pas la signature de la fonction. Cela n'a aucun sens que vous deviez spécifier un radix.
Charles Offenbacher
5

Je l'ai résolu en utilisant simplement le + foo, pour convertir la chaîne.

Gardez à l'esprit que ce n'est pas génial pour la lisibilité (correction incorrecte).

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

Vous pouvez également simplement ajouter cette ligne juste au-dessus de votre ligne parseInt:

// eslint-disable-next-line

Cela désactivera la vérification eslint pour la ligne suivante. Utilisez-le si vous ne devez sauter qu'une ou deux lignes.

Rohit Nethi
la source
2

Mettez simplement une chaîne vide à la place de radix, car parseInt () prend deux arguments:

parseInt (chaîne, radix);

chaîne La valeur à analyser. Si l'argument chaîne n'est pas une chaîne, il est converti en chaîne (à l'aide de l'opération abstraite ToString). L'espace de tête dans l'argument chaîne est ignoré.

radix Un entier compris entre 2 et 36 qui représente le radix (la base dans les systèmes numériques mathématiques) de la chaîne mentionnée ci-dessus. Spécifiez 10 pour le système numérique décimal couramment utilisé par les humains. Spécifiez toujours ce paramètre pour éliminer la confusion du lecteur et garantir un comportement prévisible. Différentes implémentations produisent des résultats différents lorsqu'une base n'est pas spécifiée, la valeur par défaut étant généralement 10.

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

Ahmed.Dz
la source
2

Ajoutez simplement votre règle personnalisée dans .eslintrc qui ressemble à cela "radix": "off" et vous serez libéré de cet avertissement de non-eslint eslint. C'est pour le linter eslint.

Goran_Ilic_Ilke
la source
1

Avant ECMAScript 5, parseInt () détectait également automatiquement les littéraux octaux, ce qui posait des problèmes car de nombreux développeurs supposaient qu'un 0 de tête serait ignoré.

Donc au lieu de:

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

Faites ceci:

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

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

var num = parseFloat(someValue); 

Référence

SanTom
la source
0

Au lieu d'appeler la substringfonction que vous pourriez utiliser.slice()

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

Ici, -1 en tranche indique que pour commencer la tranche à partir du dernier index.

Merci.

Daniel
la source