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
9 réponses
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 _.
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.
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...
}
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
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.
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
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.
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>
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++) ...