La meilleure façon de déterminer si un argument n'est pas transmis à la fonction JavaScript
J'ai maintenant vu 2 méthodes pour déterminer si un argument a été transmis à la fonction JavaScript. Je me demandais si une méthode est meilleure que l'autre ou si l'une est tout simplement mauvais à utiliser?
function Test(argument1, argument2) {
if (Test.arguments.length == 1) argument2 = 'blah';
alert(argument2);
}
Test('test');
Ou
function Test(argument1, argument2) {
argument2 = argument2 || 'blah';
alert(argument2);
}
Test('test');
Aussi loin que je peux dire, elles résultent de la même chose, mais je ne l'ai utilisé la première avant dans la production.
Une autre Option, comme mentionné par Tom:
function Test(argument1, argument2) {
if(argument2 === null) {
argument2 = 'blah';
}
alert(argument2);
}
Comme par Juan commentaire, il serait préférable de changer de Tom suggestion:
function Test(argument1, argument2) {
if(argument2 === undefined) {
argument2 = 'blah';
}
alert(argument2);
}
- C'est vraiment la même. Si vous avez toujours un nombre statique d'arguments puis aller avec la deuxième méthode, sinon il est probablement plus facile pour l'itération en utilisant le tableau d'arguments.
- Un argument qui n'a pas été adopté en tant que indéfini. Test avec une stricte égalité contre null échouera. Vous devez utiliser une stricte égalité avec indéfini.
- Rappelez-vous:
argument2 || 'blah';
entraînera 'blah' siargument2
estfalse
(!), pas simplement, si elle n'est pas définie. Siargument2
est un booléen, et la fonction est passéefalse
pour elle, cette ligne sera de retour 'blah' en dépit deargument2
être correctement défini. - Même problème si
argument2
est0
,''
, ounull
. - Très vrai. Javascript interprétation unique d'objets et le casting est à la fois la meilleure et la pire des parties.
Vous devez vous connecter pour publier un commentaire.
Il y a 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 de vérification
arguments.length
ou à l'aide de la||
opérateur à fournir des valeurs par défaut - on peut aussi explicitement vérifier les arguments pourundefined
viaargument2 === undefined
outypeof argument2 === 'undefined'
si l'on est paranoïaque (voir les commentaires).À l'aide de la
||
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 êtreundefined
,null
,false
,0
,''
(ou quelque chose d'autre quiBoolean(...)
retournefalse
).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
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 unundefined
valeur, qui, selon toute probabilité doivent être traités de la même manière que si l'argument.L'utilisation de la
||
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 être désiré.Pour résumer: à n'utiliser que si vous savez ce que vous faites!
À mon avis, à l'aide de
||
est aussi 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: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.
Si vous utilisez jQuery, une option qui est agréable (surtout pour des situations complexes) est d'utiliser jQuery étendre la méthode.
Si vous appelez la fonction comme ceci:
Les options de la variable serait alors:
C'est l'un des rares cas où je trouve le test:
fonctionne très bien et porte l'implication correcte syntaxiquement.
(Avec les simultanée de restriction que je ne voudrais pas laisser une légitime valeur null pour
argument2
qui a une autre signification, mais qui serait vraiment à confusion.)EDIT:
C'est un très bon exemple d'une différence stylistique entre faiblement typé et fortement typé langues; et d'un choix d'option javascript offre à la pelle.
Ma préférence personnelle (avec aucune critique destinés à d'autres préférences) est le minimalisme. Le moins le code est-à-dire, tant que je suis cohérent et concis, le moins que quelqu'un d'autre a comprendre pour déduire correctement mon sens.
L'une des conséquences de cette préférence est que je ne veux pas - ne trouve pas ça utile à accumuler un tas de type de dépendance de tests. Au lieu de cela, j'ai essayer de faire le code dire à quoi il ressemble, il signifie; et de tester seulement pour ce dont j'ai réellement besoin de tester pour.
L'un des aggravations je trouve dans certains autres peuples code est besoin de savoir si oui ou non ils s'attendre, dans un contexte plus large, à exécuter sur les cas, ils sont tests pour. Ou si ils sont en train de tester, pour tout ce qui est possible, à l'occasion de ne pas anticiper le contexte tout à fait satisfaisant. Ce qui signifie que je finis par avoir besoin de retracer de manière exhaustive dans les deux directions avant je peux en toute confiance refactoriser ou modifier quoi que ce soit. Je suppose qu'il ya une bonne chance qu'ils pourraient avoir à mettre ces différents tests sont en place, car ils prévoyaient le cas où elles seraient nécessaires (et qui ne sont pas habituellement évident pour moi).
(Je pense qu'un grave inconvénient dans la façon dont ces gens utilisent des langages dynamiques. Trop souvent, les gens ne veulent pas renoncer à tous les essais statiques, et à la fin de faire semblant.)
J'ai vu cette plus évidente dans la comparaison globale de code ActionScript 3 avec élégant du code javascript. L'AS3 peut être 3 ou 4 fois la masse de la js, et la fiabilité, je pense est au moins pas de meilleur, tout simplement parce que le nombre (3-4X) de codage des décisions qui ont été prises.
Comme vous le dites, Shog9, YMMV. 😀
Il existe des différences importantes. Prenons quelques cas de test:
Avec la première méthode que vous décrivez, seul le deuxième test utilisera la valeur par défaut. La deuxième méthode sera, par défaut, tous les mais la première (comme JS va convertir
undefined
,null
,0
, et""
dans le booléenfalse
. Et si vous étiez à utiliser Tom de la méthode, seul le quatrième test utilisera la valeur par défaut!La méthode que vous choisissez dépend de votre comportement voulu. Si les valeurs autres que
undefined
sont admissibles que pour lesargument2
, alors vous voudrez probablement une certaine variation sur la première; si elle est non nulle, non-nulle, la valeur non vide est souhaitée, la deuxième méthode est idéale, en effet, il est souvent utilisé pour éliminer rapidement un large éventail de valeurs.Dans l'ES6 (ES2015), vous pouvez utiliser Les paramètres par défaut
JS:
"default value"
et en vérifiant si la valeur est en effet"default value"
.Je suis désolé, j'ai encore cant commentaire, donc, pour répondre à Tom de réponse...
En javascript (undefined != null) == false
En fait, cette fonction ne marchera pas avec les "nuls", vous devrez utiliser "undefined"
Il peut être pratique pour l'approche argument de détection par l'évocation de votre fonction avec un Objet de propriétés facultatives:
Pourquoi pas à l'aide de la
!!
opérateur? Cet opérateur, placé avant la variable, tournez-la dans un booléen (si j'ai bien compris), donc!!undefined
et!!null
(et même!!NaN
, qui peut être très intéressant) sera de retourfalse
.Voici un exemple:
Il y a un difficile, aussi bien de façon à trouver, si un paramètre est passé à une fonction ou pas. Regardez l'exemple ci-dessous:
Nécessaire signifie que si la valeur de
value
n'est pas présent/passé - 0.Assez cool hein!
value
est équivalent àfalse
, mettre à 0." C'est une subtile mais très importante distinction.true
etfalse
sont des valeurs valides, et vous voudrez peut-être avoir un troisième comportement pour quand le paramètre n'est pas passé du tout (en particulier si la fonction a plus d'un paramètre).Certains moments, vous pourriez également vouloir vérifier pour le type, spécialement si vous utilisez la fonction de lecture et de définition. Le code suivant est ES6 (ne sera pas exécuté dans EcmaScript 5 ou plus):
fnCalledFunction(Param1,Param2, fenêtre.YourOptionalParameter)
Si la fonction est appelée à de nombreux endroits et que vous êtes sûr que les 2 premiers paramètres sont transmis à partir de chaque cas, mais ce n'est pas sûr 3ème paramètre, vous pouvez utiliser la fenêtre.
fenêtre.param3 va la traiter si elle n'est pas définie à partir de l'appelant de la méthode.