Supposez que vous voulez “additionner” une chaîne de caractères et un nombre. Aucun problème pour JS. Une conversion de type s'opère implicitement qui traduira un code tel que "abc" + 12 en "abc" + "12" (soit pour résultat la chaîne "abc12"). En jargon “geek”, ce mécanisme s'appelle du “typage canard” (duck typing), concept que l'on peut résumer ainsi : “quand je vois un oiseau qui se dandine comme un canard, nage comme un canard et cancane comme un canard, j'appelle cet oiseau un canard.”

Les bénéfices du typage canard ont cependant une lourde contrepartie : les types ne sont pas visibles dans le code.

function enigma(obj, val)
{
for ( var p in obj )
  if ( obj[p] == val ) return(p);
return('');
}
 
alert(enigma(SpecialCharacters,0x53456D53));
 

Dans le code ci-dessus, la fonction enigma retourne le nom intelligible d'une valeur énumérée (classe Enumeration), mais c'est bien difficile à prédire, n'est-ce pas ?

Comme chacun sait, il est indispensable de commenter soigneusement son code, à quelque niveau de programmation que l'on se situe. Si vous envisagez de relire et d'améliorer vos scripts, utilisez des noms parlants pour vos fonctions et vos variables et annotez votre code autant que de besoin pour ne pas perdre le fil.

Pour conserver une bonne visibilité sur les types impliqués dans une déclaration de fonction, une bonne pratique est d'imiter la syntaxe du langage C — <type-retour> nom-fonction(<type><arg>...) — en commentant le code de cette façon :

/*str*/ function typedEnigma(/*class*/ obj, /*int*/ val)
// ----------------------------------------
// Renvoie le nom parlant de l'id <val>
// depuis la classe <obj> (Enumeration)
// Si <val> n'est pas une valeur valide, renvoie ''
{
for ( var p in obj )
  if ( obj[p] == val ) return(p);
return('');
}
 

Je vous accorde que ce code n'est pas parfaitement commenté, mais il montre clairement les types d'arguments attendus et le type retourné par la fonction.

Voici les principaux mot-clefs que j'utilise dans cette optique :

MOTS-CLEF TYPE
/*str*/ STRING
/*int*/ NUMBER (integer)
/*bool*/ BOOLEAN
/*arr*/ ARRAY
/*flo*/ NUMBER (float)
/*var*/ VARIANT
/*obj*/ OBJECT
/*reg*/ REGEXP
/*fct*/ FUNCTION