Comment créer des paramètres par défaut pour les fonctions en Node.js

Quand les paramètres des fonctions ne sont pas renseignés, quelles alternatives possibles ? Une traduction de l'article How To Create Default Parameters for Functions

Classé dans Conventions JavaScript

Traduction

En général, une fonction prend un nombre déterminé de paramètres et exige qu'ils soient tous présents pour pouvoir être exécutée avec succès. Cependant, vous rencontrerez parfois des situations où vous souhaitez fournir une valeur par défaut pour un paramètre ou prendre un nombre variable de paramètres. Heureusement, à partir de ES6/ES2015, les paramètres par défaut figurent dans les spécifications du langage :

const pow = (base, power = 2) => {
  return Math.pow(base, power);
}

console.log(pow(2)); // `4`
console.log(pow(2,10)); // `1024`

Dans le code ci-dessus, la fonction pow renvoie le carré d'un nombre ou de toute autre puissance spécifiée dans l'appel de la fonction car l'argument power a une valeur par défaut de 2. Ainsi, si aucun second argument n'est fourni ou si la valeur fournie est indéfinie, la fonction pow utilisera 2 comme valeur de l'argument power. Mais il y a un petit problème :

const pow = (base, power = 2) => {
  return Math.pow(base, power);
}

console.log(pow(2, undefined)); // `4`
console.log(pow(2, null)); // `1`

En JavaScript, il existe de nombreuses façons d'indiquer des valeurs fausses, mais parmi celles-ci, seule la valeur undefined déclenche le paramètre par défaut. C'est la raison pour laquelle pow(2, undefined) renvoie 4 et pow(2, null) renvoie 1.

ASTUCE EN JS : Dans Math.pow(base, puissance), si la puissance est 0 ou toute autre valeur « faussée » (sauf NaN), le résultat sera toujours 1.

Malheureusement, les versions précédentes de JavaScript (ES5 et inférieures) ne prennent pas en charge les paramètres par défaut, mais au fil du temps, les gens ont développé des idiomes pour compenser.

Le premier idiome consiste à donner une valeur par défaut au dernier paramètre. Cela se fait en vérifiant si le dernier paramètre est undefined et en lui donnant une valeur par défaut si c'est le cas. On utilise parfois l'idiome : optionalParameter = optionalParameter || defaultValue. Cela peut avoir un comportement indésirable lorsqu'ils passent des valeurs qui sont égales à false comme false, 0, et "". Une meilleure façon de procéder consiste donc à vérifier explicitement que le paramètre optionnel est undefined. Voici un exemple de code montrant les deux styles et les différences de comportement :

const example = function (optionalArg) {
  optionalArg = optionalArg || "Aucun paramètre n'a été passé";
  console.log(optionalArg);
}

const betterExample = function (optionalArg) {
  if (optionalArg === undefined) {
    optionalArg = "Aucun paramètre n'a été passé";
  }
  console.log(optionalArg);
}

console.log("Sans paramètre :");
example();
betterExample();

console.log("\nAvec paramètre :");
example("Un paramètre a été passé");
betterExample("Un paramètre a été passé");

console.log("\nChaine de charactère vide :");
example("");
betterExample("");

Le deuxième cas de figure est celui où la valeur optionnelle se trouve au milieu, ce qui peut provoquer des effets indésirables puisque tous les paramètres sont déplacés. Le paramètre optionnel n'est pas la valeur undefined dans ce cas - le dernier paramètre est celui qui est undefined. Vous devez donc vérifier si le dernier paramètre est undefined, puis corriger manuellement tous les autres paramètres avant de poursuivre le code. Ce cas est également valable pour le JavaScript moderne (ES6/ES2015). L'exemple vous montre comment faire :

const example = function (param1, optParam, callback) {
  if (callback === undefined) {
    //  seulemeunt deux paramètres ont été passés, la fonction de rappel est actuellement l'objet `optParam`
    callback = optParam;

    // doner à `optParam` une valeur par défaut
    optParam = "et un paramètre par défaut";
  }
  callback(param1, optParam);
}

example("Ceci est un paramètre optionel", console.log);
example("Ceci est un paramètre optionel", "et un paramètre optionel", console.log);

Lire dans une autre langue