Logo JavaScript

Message JSLint – Missing radix parameter.

Flattr this!

Dans la série des messages JSLint, je continue avec celui-ci :

Missing radix parameter.

Cause

Prenons pour exemple ce code :

function test(a) {
    'use strict';
    return parseInt(a);
}

Le problème ici est de faire confiance à JavaScript (et oui encore) pour la transformation d'une variable de type inconnue en nombre entier. L'essentiel du temps, vous travaillerez en base 10 mais ce n'est pas systématiquement vrai.

Exemple de non fonctionnement en base 10

Un grand classique :

parseInt('08', 10)

La solution

Il est très simple de corriger ce bogue, en précisant sur quelle base numérique vous travaillez. En général, vous travaillerez en base 10. Comme ceci :

function test(a) {
    'use strict';
    return parseInt(a, 10);
}

Ou pour travailler en octal

function test(a) {
    'use strict';
    return parseInt(a, 8);
}

Bonus

Trois précisions et un billet culturel

parseFloat

Ne nécessite pas de radix car travaille systématiquement en base 10.

Tester le résultat

Quand la fonction ne peut pas retourner un entier, elle retourne systématiquement NaN. Vous n'avez donc qu'à utiliser !isNaN pour savoir que vous avez bien récupéré un entier.

Les valeurs retournant NaN avec radix = 10

  • Toutes les chaines ne contenant pas strictement que des chiffres et au maximum un point ;
  • Infinity et -Infinity ;
  • NaN ;
  • null ;
  • un tableau vide (sinon essaiera de traduire la première valeur contenue, mais pas au delà) ;
  • un objet ;
  • une fonction
  • undefined.

La tribu Aranda

J'avais écrit un article sur la façon de calculer d'une tribu presque disparue aujourd'hui. Ils comptent en base 2, mais sans le 0. Pour ceux que ça intrigue, le billet est ici.

Flattr this!

A propos de Mathieu

Ingénieur développeur web dans la vente par correspondance B2B, adepte de nouvelles technologies et d'innovation. Vous pouvez aussi me retrouver sur Twitter @mathrobin
Cette entrée a été publiée dans JavaScript, avec comme mot(s)-clef(s) , , . Vous pouvez la mettre en favoris avec ce permalien.
  • http://www.ghusse.com Ghusse

    Toutes les chaines ne contenant pas strictement que des chiffres et au maximum un point ;

    Eh bien … non.
    Démonstration : http://jsfiddle.net/ghusse/YZFY7/

    La règle est plus compliqué que ça, c’est justement ce qui explique que la règle jslint existe.
    Exemple: si la chaîne de caractère commence par « 0 », elle est interprétée comme de l’octal. Parseint s’arrête dès la première lettre ou le premier point. Mais s’il y a des chiffres avant, il va parser ceux-ci et non pas renvoyer NaN.
    Et on peut écrire « 0x4651352 », ça sera interprété comme de l’hexadécimal, parseInt ne renverra pas NaN.

    J’ai lu un article intéressant sur le sujet il y a peu de temps. La solution proposée règle presque tous les problèmes sauf celui du 0x.

    • http://www.mathieurobin.com/ Mathieu

      Hello! Très bien vu, j’avais oublié cette approche. Qui est juste la plus importante en plus et comme tu dis, la raison de l’existence de cette règle. Merci de m’avoir corrigé :)

      Et nous sommes d’accord, l’article de Christophe Porteneuve est particulièrement intéressant et complet. Faut que j’arrête d’écrire fatigué, j’en oublie la moitié.

Articles liés