864 votes

Est-il une meilleure façon de faire en option paramètres de la fonction en Javascript?

J'ai toujours manipulé les paramètres facultatifs en Javascript comme ceci:

function myFunc(requiredArg, optionalArg){
  optionalArg = optionalArg || 'defaultValue';

  //do stuff

}

Est-il un meilleur moyen de le faire?

Existe-il des cas où l'utilisation d' || comme cela est voué à l'échec?

1102voto

Paul Dixon Points 122033

Votre logique échoue si optionalArg est passé, mais fausse (false) - essayer cela comme une solution de rechange

optionalArg = (typeof optionalArg === "undefined") ? "defaultValue" : optionalArg;

194voto

Lachlan Hunt Points 716

ECMAScript 6 projet comprend actuellement la possibilité de déclarer des valeurs de paramètre par défaut dans la déclaration de la fonction.

function myFunc(requiredArg, optionalArg = 'defaultValue') {
    // do stuff
}

Mais ce n'est actuellement pris en charge par Firefox. Voir les paramètres par défaut sur MDN.

126voto

trusktr Points 4518

J'ai trouvé que cela soit le plus simple, plus lisible:

if (typeof myVariable === 'undefined') { myVariable = 'default'; }
//use myVariable here

Paul Dixon réponse (à mon humble avis) est moins lisible que cela, mais elle se résume à la préférence.

insin la réponse est beaucoup plus avancé, mais beaucoup plus utile pour les grandes fonctions!

EDIT 11/17/2013 9:33: j'ai créé un package pour Node.js cela rend plus facile la "surcharge" des fonctions (méthodes) appelé paramétrique.

45voto

Oli Points 65050

Si vous avez besoin de jeter un littéral NULL , alors vous pourriez avoir quelques questions. En dehors de cela, non, je pense que vous êtes probablement sur la bonne voie.

L'autre méthode que certaines personnes choisissent est de prendre une assoc tableau de variables d'itération dans la liste d'arguments. Il semble un peu plus soignée, mais j'imagine que c'est un peu (très peu) peu plus de processus/de mémoire intensive.

function myFunction (argArray) {
    var defaults = {
    	'arg1'	:	"value 1",
    	'arg2'	:	"value 2",
    	'arg3'	:	"value 3",
    	'arg4'	:	"value 4"
    }

    for(var i in defaults) 
    	if(typeof argArray[i] == "undefined") 
        	   argArray[index] = defaults[i];

    // ...
}

33voto

user568458 Points 3511

Idéalement, vous refactoriser à passer un objet et de le fusionner avec un objet par défaut, l'ordre dans lequel les arguments sont passés n'a pas d'importance (voir ci-dessous).

Si, toutefois, vous voulez quelque chose de rapide, fiable, facile à utiliser et peu encombrant, essayez ceci:


Un nettoyage rapide fix pour n'importe quel nombre d'arguments par défaut

  • Il évolue avec élégance: un minimum de code supplémentaire pour chaque nouvelle valeur par défaut
  • Vous pouvez coller n'importe où: il suffit de changer le nombre de arguments et les variables
  • Si vous souhaitez passer undefined à un argument avec une valeur par défaut, de cette façon, la variable est définie comme undefined. La plupart des autres options de cette page remplacerait undefined avec la valeur par défaut.

Voici un exemple pour fournir des valeurs par défaut pour les trois arguments optionnels (avec deux arguments requis)

function myFunc(reqOne,reqTwo, optOne,optTwo,optThree) {

  switch (arguments.length - 2) { // <-- 2 is number of required arguments
    case 0:  optOne = 'Some default';
    case 1:  optTwo = 'Another default';
    case 2:  optThree = 'Some other default';
  }

}

(intentionnellement pas de rupture entre les cas: chaque cas implique la prochaine cas est également vrai)

Ceci est similaire à roenving réponse, mais facilement extensible pour un nombre quelconque d'arguments par défaut, plus facile à mettre à jour, et à l'aide de arguments pas Function.arguments.


De passage et de fusion d'objets pour plus de flexibilité

Le code ci-dessus, à l'instar de beaucoup de manières de faire des arguments par défaut, ne peut pas se passer des arguments en dehors de la séquence, par exemple, en passant optThree mais en laissant de l' optTwo pour revenir à sa valeur par défaut.

Une bonne option consiste à passer des objets et de les fusionner avec un objet par défaut. C'est aussi bon pour la maintenabilité.

Exemple d'utilisation de jQuery (que vous pouvez à la place utiliser le trait de Soulignement de l' _.defaults(object, defaults) ou parcourir les options):

function myFunc( args ) {
  var defaults = {
    optOne: 'Some default',
    optTwo: 'Another default',
    optThree: 'Some other default'
  };
  args = $.extend({}, defaults, args);

  console.log(args.optOne, args.optTwo, args.optThree);
}

// example using it
myFunc({
  optOne: "We'll override optOne and optThree...",
  optThree: "...leaving optTwo to use its default."
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X