JavaScript : Les conversions de type implicites
#1 Qu'est-ce qu'une conversion de type implicite ?
Il existe deux sortes de conversion de type :
- Il y a celles que vous demandez. Je veux dire celles que vous programmez. On les appelle les conversions explicites. Par exemple, vous codez un
parseInt()
pour convertir une chaîne de caractères en unnumber
. - Il y a celles que vous ne demandez pas. On les appelle les conversions implicites. Par exemple, vous multipliez
"4" * 3
et le résultat est12
, car la chaîne de caractères"4"
a été convertie ennumber
. Mais cette fois, c'est l'opérateur multiplier qui en a fait la demande au moteur JavaScript. Ce n'est pas vous !
Donc, comprenez bien ce qui se passe. L'opérateur multiplier travaille sur des number
et si les opérandes qui lui sont fournis ne sont pas des number
alors, il demande des conversions. Et ceci est valable en JavaScript pour tous les opérateurs. Si le type des opérandes ne convient pas, l'opérateur demande une conversion vers le type qui lui convient.
Vous voyez bien ci-dessous, que la chaîne "4"
a pris la valeur numérique 4
et pour cela, elle a été convertie. Ce n'est pas possible autrement.
Alors, vous allez me dire que c'est idiot de prendre une chaîne pour la multiplier par un nombre. Sauf qu'il arrive qu'on le fasse sans s'en rendre compte. Par exemple, supposez que vous fassiez appel à un prompt
pour saisir le 4
. Donc, vous faites un let x = prompt()
, puis vous rentrez votre 4
en tapant sur la touche 4
. Donc, vous pensez intuitivement avoir saisi une valeur numérique, donc un number
. Maintenant, vous faites un typeof de x
et vous constatez que le prompt
vous retourne string
. Tout se passe comme si vous aviez saisi un "4"
.
Maintenant si je multiplie mon x
par 3
. J'obtiens 12
. Et je me dis super tout est bien qui finit bien, sauf qu'il y a eu des conversions de type et il faut en être conscient, car la conversion implicite ne fera pas toujours notre affaire.
Justement, prenons un autre exemple. J'ajoute mon x
à un 3
. Et là, j'obtiens "43"
. J'aurais pu m'attendre à un 7
. Sauf, qu'ici le moteur JavaScript vient de faire une concaténation de chaîne de caractères et pas une addition de number
. (* Je détaille le cas de cet opérateur ensuite).
Alors, je vais vous donner un conseil important : NE PERDEZ JAMAIS DE VUE LE TYPE D'UNE VARIABLE. C'est la cause de nombreux bugs.
Dans la suite du tuto, je vais vous montrer les principales situations dans lesquelles vous allez rencontrer des conversions de type implicites.
#2 Vocabulaire
Dans le vocabulaire des programmeurs, il y a différentes façons de parler de conversion de type :
- Le terme coercition de type est utilisé pour désigner une conversion de type. Coercition signifie en français action de contraindre. Donc ici, on contraint le type de la variable.
- Vous pouvez rencontrer aussi le terme de transtypage.
- Il est fréquent aussi que les programmeurs utilisent un anglicisme. Pour dire qu'ils font une conversion de type, ils disent qu'ils font un cast. Il arrive même, lorsque l'on discute entre programmeurs, que l'on conjugue le mot cast, comme si c'était un verbe de la langue française. Un programmeur peut très bien vous dire, au sujet d'une variable, "caste la en entier" ou bien "caste la en chaîne". Ca fait partie de notre jargon de programmeur.
#3 Les opérateurs arithmétiques
On a déjà fait la multiplication. On a vu que cet opérateur travaille sur des number
et va donc réclamer des number
. Cela va être le cas pour les opérateurs suivants :
- Pour la division
"4" / 3
donne1.3333
. - Pour la soustraction
"4" - 3
donne1
. Si vous faites"4" - "3"
c'est pareil, il convertit les deux. - Pour la division euclidienne (le modulo)
"4" % 3
donne1
(le reste de la division euclidienne de 4 par 3 vaut 1).
Il faut que je précise une chose, c'est que la chaîne "4"
est convertie dans le number
4
parce que dans ce cas le moteur comprend ce qu'on lui dit et est capable de faire la conversion. Si j'écris "quatre" - 3
alors là, il ne comprend plus et il retourne NaN
(Not a Number).
#4 Le cas particulier de l'addition +
L'opérateur d'addition est un opérateur particulier. Il peut faire soit l'addition de number
, soit la concaténation de chaînes de caractères c'est-à-dire de string
. On dit que c'est un opérateur surchargé. Pour choisir l'opération qu'il va faire, il se base sur le type des opérandes qui lui sont fournis. Trois cas de figures peuvent se présenter :
- Les opérandes sont tous les deux des
number
. Par exemple,4+3
et à ce moment-là, il procède à une addition denumber
, et il vous trouve7
. - Les opérandes sont tous les deux des
string
. Par exemple,"4"+"3"
et à ce moment-là, il procède à la concaténation des chaînes de caractères, et il vous trouve"43"
. - Les opérandes n'ont pas le même type. Par exemple,
"4"+3
. Dans ce cas, il se retrouve avec unstring
et unnumber
. Là, il ne sait pas faire. Pour s'en sortir, il doit choisir un opérande et le convertir. Il va systématiquement choisir de convertir lenumber
enstring
, et il va nous donner"43"
.
Vous avez beaucoup de conversion de ce type lorsque vous faites des console.log
en mélangeant des valeurs numériques et des chaînes.
#5 Les opérateurs de comparaisons
Maintenant, on va faire un test. On va tester si "3"
est égal à 3
. Pour cela, on va utiliser un test simple, c'est-à-dire un double égal. Et vous constatez que dans ce cas, il y a une conversion de type implicite et que les valeurs sont comptées comme égales. C'est la même chose si vous demandez si elles sont différentes. Et dans ce cas, il vous dit qu'elles ne sont pas différentes.
C'est pour éviter ce genre d'approximation qu'il vaut mieux utiliser le ===
ou le !==
pour effectuer des comparaisons.
On peut continuer avec les valeurs booléennes true
et false
qui sont équivalentes à 0
et à 1
.
#6 Conversion en booléen sur une condition
Je vais examiner maintenant les conversions vers des booléens, qui sont faites au moment des évaluations des conditions. Par exemple, celles des tests conditionnels. On peut trouver ça aussi sur la condition qui est évaluée avec l'opérateur ternaire, voir sur certaines conditions de boucles.
Je vous ai présenté dans ce tuto l'essentiel des conversions de type implicites. En tout cas, je vous ai présenté celles que l'on rencontre le plus souvent. Comprenez bien qu'il existe une multitude de cas. Ce que je vous ai montré ne constitue qu'une petite partie des différentes situations que l'on peut rencontrer.