Il existe plusieurs façons de vérifier si un argument est passé à une fonction. En plus des deux que vous avez mentionné dans votre (original) question - vérification de l' arguments.length
ou à l'aide de l' ||
de l'opérateur de fournir des valeurs par défaut - on peut aussi explicitement vérifier les arguments pour undefined
par argument2 === undefined
ou typeof argument2 === 'undefined'
si l'on est paranoïaque (voir les commentaires).
À l'aide de l' ||
opérateur est devenu un standard de pratique - tous les cool kids à le faire - mais attention: La valeur par défaut sera déclenchée si l'argument évalue false
, ce qui signifie qu'il pourrait en fait être undefined
, null
, false
, 0
, ''
(ou n'importe quoi d'autre pour qui Boolean(...)
retours false
).
Donc, la question est de savoir quand utiliser les vérifier, car elles conduisent toutes à des résultats légèrement différents.
Vérification de l' arguments.length
des expositions le plus correct " de comportement, mais il pourrait ne pas être possible si il n'y a plus d'un argument optionnel.
Le test pour undefined
est à côté de la 'meilleure' - il échoue seulement si la fonction est appelée explicitement avec un undefined
de la valeur, qui, selon toute probabilité doivent être traités de la même manière que l'omission de l'argument.
L'utilisation de l' ||
opérateur pourrait déclencher de l'utilisation de la valeur par défaut, même si un argument valide est fourni. D'autre part, son comportement pourrait en fait être désiré.
Pour résumer: à n'utiliser que si vous savez ce que vous faites!
À mon avis, à l'aide de ||
est également la voie à suivre si il y a plus d'un argument optionnel et l'on ne veut pas passer un objet littéral comme une solution de contournement pour les paramètres nommés.
Une autre belle façon de fournir des valeurs par défaut à l'aide de arguments.length
est possible en tombant à travers les étiquettes d'une instruction switch:
function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
switch(arguments.length) {
case 1: optionalArg1 = 'default1';
case 2: optionalArg2 = 'default2';
case 3: optionalArg3 = 'default3';
case 4: break;
default: throw new Error('illegal argument count')
}
// do stuff
}
Cela a l'inconvénient que le programmeur a l'intention n'est pas (visuellement) évident, et utilise des "nombres magiques"; c'est donc peut-être sujettes à erreur.