En JavaScript, on ne peut pas restreindre le nombre d’arguments attendus par une fonction, ni définir des paramètres comme facultatifs. Voici l’implémentation traditionnelle de la fonction Somme en JavaScript (Sum en Anglais), qui prend un nombre quelconque d’arguments en paramètre, les additionne, puis retourne le résultat :
function sum(){
var result = 0;
for (var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
Comme vous pouvez le constater, il n’y a pas d’arguments dans la signature de la fonction, mais le mot-clé arguments permet de récupérer le tableau des paramètres passés à la fonction et ainsi de le traiter dans le code de la fonction. Par contre, ce n’est pas très pratique si l’on veut définir un nombre déterminé de paramètres. 🤨
Et pour définir des valeurs par défaut ? Les développeurs avaient l’habitude de bricoler pour faire comme si les variables par défaut étaient supportées :
function someFunction (defaultValue) {
defaultValue = defaultValue || undefined;
return defaultValue;
}
Dans le code ci-dessus, si aucun paramètre n’est passé en paramètre, la fonction renverra undefined, sinon elle renverra la valeur passée en paramètre.
Imaginons une fonction qui multiplie deux nombres passés en paramètres. Mais le deuxième paramètre est facultatif, et vaut un par défaut :
function multiply (a, b) {
// b est facultatif
var b = typeof b !== 'undefined' ? b : 1;
return a*b;
}
multiply (2, 5); // 10
multiply (1, 5); // 5
multiply (5); // 5
A la ligne 3, nous utilisons un opérateur ternaire pour attribuer la valeur 1 à la variable b si aucun nombre n’a été passé en deuxième paramètre. Ce code semble très compliqué pour réaliser quelque chose de très simple.
Heureusement, ES6 nous permet d’utiliser une syntaxe plus élégante :
function multiply (a, b = 1) {
return a*b;
}
multiply (5); // 5
Avec ES6, il suffit de définir une valeur par défaut dans la signature même de la fonction.
C’est quand même beaucoup plus pratique, non ? 😎