Dans JavaScript, Comment puis-je créer une fonction avec un paramètre optionnel?

Question: Quelle est la bonne façon de définir une fonction en JavaScript qui prend des paramètres facultatifs?

Par exemple:

function myFunc(optionVar1) {
    if(optionVar1 == undefined) {
        ...
    } else {
        ...
    }
}

myFunc('10');  // valid function call
myFunc();      // also a valid function call

est-il correct d'utiliser un ? marquer comme Ruby dans la déclaration de la fonction comme ceci pour indiquer les paramètres optionnels:

function myFunc(optionVar1?) {...}  //  <--- notice the ? mark
24
demandé sur Sinan Ünür 2010-02-09 03:14:58
la source

9 ответов

la première réponse google que j'ai découverte:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions

Je n'ai vu aucun cas où un point d'interrogation est utilisé pour alerter un appelant sur un paramètre optionnel. Bien que ce soit fait dans d'autres langues, Je ne pense pas que ce soit nécessaire en javascript.

En fait, il semble que vous vous ne pouvez pas utiliser un point d'interrogation dans le nom de la variable. Seulement lettres, chiffres, $ et _.

1
répondu Damovisa 2018-07-25 10:55:57
la source

il n'y a pas de syntaxe dans Javascript qui spécifie qu'un paramètre est optionnel (ou requis). Tous les paramètres sont facultatifs. S'ils ne sont pas spécifiés, ils sont undefined donc vous devez vérifier pour cela. Par exemple, cette fonction va créer une valeur par défaut de 10 pour le paramètre:

function myfunc(someParam) {
  if (someParam === undefined) {
    someParam = 10;
  }
  ...
}

vous pouvez également accéder aux paramètres de façon programmatique en utilisant le arguments propriété.

enfin, si vous avez plus de 3-4 paramètres, c'est généralement conseillé d'utiliser un objet anonyme la place.

56
répondu cletus 2013-10-31 21:11:24
la source

en fait, tous les paramètres sont optionnels dans les fonctions JS. Il n'y a pas d'avertissement ou d'erreur si vous omettez un paramètre.

Vous pouvez définir les valeurs par défaut comme

function throw_cat(dist){
  dist = typeof dist=='undefined' ? 20 : dist;
   //OR
  dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default
  //etc...
  }
7
répondu JAL 2010-02-09 04:12:25
la source

vous pouvez utiliser des annotations comme {Object=} ou {number=} dans la section commentaire en utilisant un doclet:

/** 
 * @param {object=}xyz
 */ 

IDE moderne sait reconnaître les annotations pour JavaScript et vous montre des indications sur les problèmes potentiels dans votre code.

Exemple:

/**
 *
 * @param query 
 * @param callback 
 * @param {number=} ttl optional time-to-leave
 */
 loadByJSONP:function loadByJSONP(query, callback, ttl) {
   ...do some work
 }

Dans cet exemple, " ttl " est facultative. l'annotation {number=} indique à IDE que ce paramètre est optionnel. En conséquence, lorsque vous appelez cette fonction avec deux paramètres seulement, vous aurez pas obtenir une alerte.

les Annotations peuvent également être utilisées pour désigner le type attendu. cela rend votre code meilleur et moins sujet aux bogues. Voici le lien pour les annotations:

https://developers.google.com/closure/compiler/docs/js-for-compiler

4
répondu Gilad 2012-10-21 14:41:26
la source

tout D'abord, tout le monde qui écrit JavaScript, faites-vous une faveur et passer par Apprendre Le JavaScript Avancé John Resig.

function myFunc(arg1, arg2 /* varargs... */) {
  var optional = Array.prototype.slice.call( arguments, 2 );

Chaque paramètre d'une fonction est "facultatif", même ceux que vous déclarez dans la liste des paramètres de la déclaration de la fonction.

il suffit de considérer documentation bien.

3
répondu nicerobot 2010-02-09 05:59:52
la source

certaines sources vous diront de sauter les paramètres et d'utiliser le tableau des arguments. Cela vous permet de prendre n'importe quelle entrée qui est fournie à votre fonction, et vous pouvez décider comment répondre aux arguments passés à votre fonction comme bon vous semble.

Vous pouvez en lire plus à ce sujet ici: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

2
répondu Frank DeRosa 2010-02-09 03:21:02
la source

cletus et Damovisa ont fait de bonnes suggestions. Je voudrais aussi ajouter que certains (comme moi) peut préférer une notation comme ceci:

function foo(/*bar*/) {
   if (arguments.length == 1) {
      var bar = arguments[0];
      ...
   }
}

cela sert à documenter aux développeurs de votre base de code que l'argument est optionnel et documente aussi le nom, mais cela empêche également l'argument d'apparaître dans le nom de la fonction dans un débogueur (l'exemple apparaîtrait comme foo () plutôt que foo (optional_argument). Sinon, les développeurs qui sont la consommation de L'API pourrait supposer qu'elle était nécessaire.

Edit: ceci est particulièrement utile pour les arguments optionnels qui sont destinés à être utilisés en interne.

2
répondu Bryan Matthews 2010-02-09 03:31:29
la source

Ne définissez simplement pas la fonction avec des paramètres et accédez au tableau des arguments spéciaux à partir de la fonction où vous voulez que les paramètres optionnels soient. L'exemple ci-dessous.

<HTML>
<HEAD>
<SCRIPT Language="JavaScript">
function foo() {
  var argv = foo.arguments;
  var argc = argv.length;
  for (var i = 0; i < argc; i++) {
    alert("Argument " + i + " = " + argv[i]);
   }
}
</SCRIPT>
</HEAD>
<BODY onload="foo('hello', 'world');">
</BODY>
</HTML>
1
répondu James 2010-02-09 03:19:29
la source

est-il correct d'utiliser a ? marque comme le Rubis dans la déclaration de fonction

Non, il n'y a pas de façon basée sur la langue pour indiquer un arg optionnel. Je pense vraiment qu'il vaut la peine de l'indiquer dans un commentaire:

function myFunc(var1, var2 /* optional */, var3 /* optional */) {
    if (var2===undefined) ...

(Notez le triple-égal pour le test d'égalité exact. Sinon un passé null la valeur correspondra aussi. En général, vous voulez === pour la plupart des comparaisons dans JS, comme le double-égal est injustement faiblement typé.)

Pour quand vous avez un nombre indéterminé d'arguments optionnels, vous les omettez généralement de la déclaration de fonction, et encore une fois un commentaire est poli:

function myFunc(var1 /* , optional var2..varN */) {
    for (var i= 1; i<arguments.length; i++) ...
1
répondu bobince 2010-02-09 03:39:33
la source

Autres questions sur