Les inclassables

Parent Previous Next



Les inclassables



Bien que les objets Number et Math implémentent l'essentiel des méthodes de gestion des données numériques qui existent en Javascript, certaines fonctions globales permettent de faire quelques conversions et contrôles de données un peu plus poussés.


Les fonctions de conversion


Si vous avez lu tous les chapitres précédents (ce que vous devriez avoir fait), vous avez normalement déjà vu ces deux fonctions, mais nous allons revoir leur utilisation dans le doute.

Ces deux fonctions se nomment parseInt() et parseFloat(), elles permettent de convertir une chaîne de caractères en un nombre. La première possède deux arguments tandis que la seconde en possède un seul :


L'importance du deuxième argument est simple à démontrer avec un exemple :

var myString = '08';

 

alert(parseInt(myString)); // Affiche : 0

alert(parseInt(myString, 10)); // Affiche : 8


Alors pourquoi cette différence de résultat ? La solution est simple : en l'absence d'un second argument, les fonctions parseInt() et parseFloat() vont tenter de deviner la base utilisée — et donc le système de numération associé — par le nombre écrit dans la chaîne de caractères. Ici, la chaîne de caractères commence par un 0, ce qui est caractéristique du système octal, on obtient donc 0 en retour. Afin d'éviter d'éventuelles conversions hasardeuses, il est toujours bon de spécifier le système de numération de travail.


Attention à une chose ! Les fonctions parseInt() et parseFloat() peuvent réussir à retrouver un nombre dans une chaîne de caractères, ainsi, la chaîne de caractères « 303 pixels » renverra bien « 303 » après conversion. Cependant, cela ne fonctionne que si la chaîne de caractères commence par le nombre à retourner. Ainsi, la chaîne de caractères « Il y a 303 pixels » ne renverra que la valeurNaN. Pensez-y !


Les fonctions de contrôle


Vous souvenez-vous des valeurs NaN et Infinity ? Nous avions parlé de deux fonctions permettant de vérifier la présence de ces deux valeurs ; les voici : isNaN() qui permet de savoir si notre variable contient un nombre et isFinite() qui permet de déterminer si le nombre est fini.


isNaN() renvoie true si la variable ne contient pas de nombre, elle s'utilise de cette manière :

var myNumber = parseInt("test"); // Notre conversion sera un échec et renverra « NaN »

 

alert(isNaN(myNumber)); // Affiche « true », cette variable ne contient pas de nombre


Quant à isFinite(), cette fonction renvoie true si le nombre ne tend pas vers l'infini :

var myNumber = 1/0; // 1 divisé par 0 tend vers l'infini

 

alert(isFinite(myNumber)); // Affiche « false », ce nombre tend vers l'infini


Mais pourquoi utiliser ces deux fonctions ? Je n'ai qu'à vérifier si ma variable contient la valeur NaNou Infinity


Admettons que vous fassiez cela ! Essayons le cas de NaN :

var myVar = "test";

 

if (myVar == NaN) {

    alert('Cette variable ne contient pas de nombre.');

} else {

    alert('Cette variable contient un nombre.');

}


Voyez-vous le problème ? Cette variable ne contient pas de nombre, mais ce code croit pourtant que c'est le cas. Cela est dû au fait que l'on ne fait que tester la présence de la valeur NaN. Or elle est présente uniquement si la tentative d'écriture d'un nombre a échoué (une conversion loupée par exemple), elle ne sera jamais présente si la variable était destinée à contenir autre chose qu'un nombre.


Un autre facteur important aussi, c'est que la valeur NaN n'est pas égale à elle-même !

alert(NaN == NaN); // Affiche : « false »


Bref, la fonction isNaN() est utile car elle vérifie si votre variable était destinée à contenir un nombre et vérifie ensuite que ce nombre ne possède pas la valeur NaN.


Concernant isFinite(), un nombre peut tendre soit vers l'infini positif, soit vers l'infini négatif. Une condition de ce genre ne peut donc pas fonctionner :

var myNumber = -1/0;

 

if (myNumber == Number.POSITIVE_INFINITY) {

    alert("Ce nombre tend vers l'infini.");

} else {

    alert("Ce nombre ne tend pas vers l'infini.");

}



Ce code est faux, on ne fait que tester si notre nombre tend vers l'infini positif, alors que la fonctionisFinite() se charge de tester aussi si le nombre tend vers l'infini négatif.


En résumé



Créé avec HelpNDoc Personal Edition: Création d'aide CHM, PDF, DOC et HTML d'une même source

Site à deux balles