home icon contact icon rss icon last FM icon facebook icon LinkedIn icon Delicious icon twitter icon

Paramètres Optionnels en JavaScript

Dans bien des langages, il est possible de définir des paramètres optionnels dans la signature des méthodes. Ces paramètres prennent une valeure par défaut s'ils ne sont pas spécifiés à l'appel de la méthode.

Par exemple, on pourrait être tenté d'écrire :

var saySomething = function(value = "default value") {
        alert(value);
     }

Seulement, en JavaScript, cela ne fonctionne pas.

Par contre, on peu utiliser une propriété de JavaScript pour arriver à nos fins : si un argument est attendu dans la signature mais pas spécifié dans l'appel, il sera alors de tupe "undefined". On peut donc faire :

var saySomething = function(value) {
      if (typeof value == "undefined") {
        value = "default value";
      }
      alert(value);
    }

Seulement, ce n'est pas très élégant. Si nous avons plusieurs arguments optionnel, la succession de structures conditionnelles peut vite devenir ennuyeuse.

Pour y remédier, on peut utiliser les objets. En Javascript, les objets sont des ensembles de clé/valeur dont les premières sont des dénominations et les dernières des instances d'autres objets. Ils sont comparables aux hashes Ruby et on peut avoir des itérateurs dessus grace à l'instruction in et à la structure de bouche for

Du coup, on pourrait imaginer le code suivant :

var extend_instance = function(destination, source) {
      for (var property in source)
        destination[property] = source[property];
      return destination;
    }
    var saySomething = function(params) {
      params = extend_instance({
        value: 'default value', 
        from: 'Anonymous Caword'
      }, params);
      alert(params.from + "say :" + params.value);
    }

L'appel de la méthode change un peu puisqu'il faut maintenant lui donner un objet, mais cela rend le code plus souple aux changement et n'impose aucun ordre aux arguments.

Pour aller encore un peu plus loin et en gardant les avantages de cette méthode, on pourrait se servir de la variable local aux méthodes : arguments

var extend_instance = function(destination, source) {
      for (var property in source)
        destination[property] = source[property];
      return destination;
    }
    var saySomething = function() {
      params = extend_instance({
        value: 'default value', 
        from: 'Anonymous Caword'
      },arguments[0] || { });
      alert(params.from + "say :" + params.value);
    }

Dawi dit

le Vendredi 27 mars 2009 à 06h06

Message à caractère informatif ? ............C'était vraiment très intéressant !

Lrdjv dit

le Vendredi 27 mars 2009 à 08h08

Sinon, si l'on ne veut pas passer un objet d'option à notre fonction, et être plus propre qu'un type of, on peu faire ça =>

      var saySomething = function(value) {
          value = value || "Hello world!";
          alert(value);
      }//saySomething

... Dsl

Meuble dit

le Vendredi 27 mars 2009 à 12h12

Dawi > gni ?

Lrdjv > Oui, c'est vrai, c'est du sucre syntaxique qui revient à mon premier exemple. Dans tout les cas faut évaluer value et si ce n'est pas définie, appliquer la valeur par défaut. Et ça ne rajoute rien en souplesse et DRYness... Mais effectivement, c'est plus jolie ^^