J'ai récemment appris qu'il était possible d'utiliser une instruction switch soignée avec fallthrough pour définir des valeurs d'argument par défaut en Javascript :
function myFunc(arg1, arg2, arg3) {
//replace unpassed arguments with their defaults:
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
J'ai appris à beaucoup l'apprécier, car non seulement il est très court, mais il fonctionne également sur la base des paramètres réellement passés, sans dépendre d'une classe spéciale de valeurs (null, falsy, etc.) servant de substituts comme dans les versions plus traditionnelles :
function myFunc(arg1, arg2, arg3){
//replace falsy arguments with their defaults:
arg1 = arg1 || "default1";
arg2 = arg2 || "default2";
arg3 = arg3 || "default3";
}
Après avoir vu la version utilisant le commutateur, j'ai tout d'abord pensé que je devais envisager de l'utiliser "par défaut" au lieu du commutateur. ||
version.
Le switch fallthough ne le rend pas beaucoup plus long et il a l'avantage d'être beaucoup plus "robuste" dans la mesure où il ne se soucie pas des types des paramètres. Dans le cas général, cela semble être une bonne idée de ne pas avoir à se soucier de ce qui se passe avec toutes les valeurs fausses ('', 0, null, false ...) chaque fois que je dois faire une fonction avec des paramètres par défaut.
Je réserverais alors le arg = arg || x
pour les cas réels où je veux vérifier la véracité des informations, au lieu de l'utiliser comme règle générale pour les paramètres par défaut.
Cependant, j'ai trouvé très peu exemples de ce modèle lorsque j'ai fait une recherche de code pour ça, alors j'ai dû mettre mon chapeau de sceptique. Pourquoi n'ai-je pas trouvé plus d'exemples de cet idiome ?
- Est-il seulement maintenant très connu ?
- Je n'ai pas assez bien cherché ? Ai-je été perturbé par le grand nombre de faux positifs ?
- Y a-t-il quelque chose qui le rende inférieur aux autres solutions ?
Quelques raisons auxquelles j'ai pensé (ainsi que certains commentaires) pour éviter switch(arguments.length)
:
-
Utiliser des paramètres nommés passés via un objet littéral est très flexible et extensible. Peut-être que les endroits où plus d'arguments peuvent être optionnels utilisent ceci à la place ?
-
Peut-être que la plupart du temps, nous faire Vous voulez vérifier la véracité des faits ? L'utilisation d'une catégorie de valeurs comme titulaires de palce permet également aux paramètres par défaut d'apparaître au milieu plutôt qu'à la fin seulement :
myFunc('arg1', null, 'arg3')
-
Peut-être que la plupart des gens préfèrent simplement le très court
arg = arg || "default"
et la plupart du temps, nous ne nous soucions pas des valeurs falsy ? -
Peut-être que l'accès
arguements
est mauvais/impossible ? -
Peut-être que ce genre d'interrupteur a un mauvais côté auquel je n'ai pas pensé ?
Ces inconvénients sont-ils suffisants pour éviter d'utiliser switch(arguments.length)
comme un modèle d'argument par défaut ou est-ce une astuce que je devrais garder et utiliser dans mon code ?