
Parmi les nombreuses critiques formul�es � l'encontre de JavaScript par ses d�tracteurs, celle qui revient surement le plus souvent est que JavaScript est un langage faiblement typ�.
Or, selon le principe qu'une v�rit� est un mensonge mille fois r�p�t�, cette assertion selon laquelle JavaScript est un langage faiblement typ� est devenue une v�rit� pour quasiment tout le monde (moi y compris pendant longtemps), sans que personne ne prenne le temps de r�fl�chir au probl�me.
J'ai donc voulu effectuer des recherches ici ou l� pour v�rifier cette affirmation. Quel ne fut pas mon d�sarroi en constatant qu'au final, il est tr�s compliqu� de savoir si un langage est � typage faible ou fort ! Les avis des plus �minents et avis�s des d�veloppeurs sont souvent divergents, parfois contradictoires.
Alors basons-nous sur quelques faits.
Pourquoi dit-on que JavaScript est faiblement typ� ?
En fait, les arguments se r�sument bien souvent � expliquer qu'on peut additionner des nombres et des chaines !
La r�alit�, c'est qu'effectivement, tout op�rateur renvoie un r�sultat en JavaScript, quitte � modifier le type de l'un des op�randes.
Mais cela n'a rien � voir avec un typage fort ou faible : il ne s'agit l� que d'une notion de typage dynamique.
Donc effectivement, pour chaque op�rateur, des r�gles existent pour d�terminer comment modifier dynamiquement le type d'un ou plusieurs op�randes afin de pouvoir toujours renvoyer un r�sultat.
Notez au passage que le code suivant :
1 2 3 4 5
| var nb = 42;
var txt = 'foo';
console.log('nb : ', typeof nb, 'txt : ', typeof txt);
var resultat = nb+txt;
console.log('resultat : ', typeof resultat, 'nb : ', typeof nb, 'txt : ', typeof txt); |
Affichera
nb : number txt : string
resultat : string nb : number txt : string
Le typage dynamique n'affecte donc pas le type des op�randes.
Pourquoi JavaScript serait un langage fortement typ� ?
La r�ponse courte serait tout simplement du fait de la pr�sence d'erreurs de type en JavaScript !
En d�taillant un peu, il faut consid�rer tout d'abord que JavaScript est un langage orient� objet dans lequel tout (absolument tout) est objet. M�me si les types primitifs d�clar�s � l'aide de litt�raux n'h�ritent pas de la m�me chaine de prototypes qu'avec un constructeur, ce sont malgr� tout des objets.
De ce fait, � part avec les op�rateurs, les seules manipulations que l'on peut faire sur des variables correspondent � des m�thodes d'objets. Or si vous appliquez une m�thode � un objet dont le type n'est pas conforme, vous obtiendrez une erreur de type.
1 2 3
| console.log(12..push(3)); // TypeError: 12.push is not a function
console.log(12..charAt(1)); // TypeError: 12.charAt is not a function
console.log([1,2,3,4].toFixed(2)); // TypeError: [1, 2, 3, 4].toFixed is not a function |
On pourrait multiplier les exemples !
Notez toutefois que le param�tre pass� � la m�thode peut lui �tre transtyp� dynamiquement afin d'obtenir un r�sultat.
Tout est donc clair maintenant : JavaScript est bel et bien un langage fortement typ� !
Le mot de la fin
Pour terminer, certains "puristes" du typage fort vous diront qu'en fait, un typage fort existe si le type est d�fini � la cr�ation de la variable.
Alors effectivement, ce n'est pas forc�ment le cas en JavaScript, en revanche, le type est d�termin� une fois pour toutes � la d�finition de la variable.
En effet, nous avons vu que le typage dynamique n'affecte pas en r�alit� le type de la variable, mais pour aller plus loin, il n'existe aucun m�canisme en JavaScript pour modifier r�ellement en JavaScript ! Aucun op�rateur, aucune fonction n'existe pour cela !
Oh... j'en entends d�j� se gausser : "sur ce coup l�, on va vite le coincer !"
Et oui, si vous faites
1 2 3 4
| var nb = 42;
console.log(typeof nb); // number
nb = 'foo';
console.log(typeof nb); // string |
Le seul hic, c'est que l� vous n'avez pas transtyp� la variable nb, vous l'avez juste red�finie !
Mais faites par exemple
1 2 3
| var tab = [1,2,3];
tab.join(',');
console.log(Array.isArray(tab)); // true |
La m�thode join() a renvoy� une valeur de type chaine, mais n'a pas touch� au type de tab.
Qu'en pensez-vous ?
Consid�rez-vous comme moi qu'au final, JavaScript est fortement typ� ?
Si oui, avez-vous d'autres arguments pour �tayer cette affirmation ?
Au contraire, me prenez-vous pour un illumin� ?
Dans ce cas, quels arguments vous font penser cela ?
Partager