Ich habe jetzt 2 Methoden gesehen, um festzustellen, ob ein Argument an eine JavaScript-Funktion übergeben wurde. Ich frage mich, ob eine Methode besser ist als die andere oder ob eine nur schlecht anzuwenden ist.
function Test(argument1, argument2) {
if (Test.arguments.length == 1) argument2 = 'blah';
alert(argument2);
}
Test('test');
Oder
function Test(argument1, argument2) {
argument2 = argument2 || 'blah';
alert(argument2);
}
Test('test');
Soweit ich das beurteilen kann, führen beide zu demselben Ergebnis, aber ich habe bisher nur das erste in der Produktion verwendet.
Eine weitere Option, wie von Tom erwähnt :
function Test(argument1, argument2) {
if(argument2 === null) {
argument2 = 'blah';
}
alert(argument2);
}
Laut Juans Kommentar wäre es besser, Toms Vorschlag zu ändern in:
function Test(argument1, argument2) {
if(argument2 === undefined) {
argument2 = 'blah';
}
alert(argument2);
}
javascript
arguments
Darryl Hein
quelle
quelle
argument2 || 'blah';
in ‚blah‘ führen , wennargument2
istfalse
, nicht nur , wenn es nicht definiert ist (!). Wennargument2
es sich um einen Booleschen Wert handelt und die Funktion dafür übergebenfalse
wird, gibt diese Zeile trotzargument2
korrekter Definition 'blah' zurück .argument2
ist0
,''
odernull
.Antworten:
Es gibt verschiedene Möglichkeiten, um zu überprüfen, ob ein Argument an eine Funktion übergeben wurde. Zusätzlich zu den beiden, die Sie in Ihrer (ursprünglichen) Frage erwähnt haben - Überprüfen
arguments.length
oder Verwenden des||
Operators zum Bereitstellen von Standardwerten - kann man auch die Argumente explizit aufundefined
via überprüfenargument2 === undefined
oder prüfen,typeof argument2 === 'undefined'
ob man paranoid ist (siehe Kommentare).Die Verwendung von
||
Operator hat zum Standard geworden - alle coolen Kinder es tun - aber Vorsicht: Der Standardwert wird , wenn das Argument auswertet ausgelöst werdenfalse
, was bedeutet es eigentlich sein könnteundefined
,null
,false
,0
,''
(oder irgendetwas anderes , für dieBoolean(...)
Rückkehrfalse
).Die Frage ist also, wann welcher Check verwendet werden soll, da alle leicht unterschiedliche Ergebnisse liefern.
Das Überprüfen
arguments.length
zeigt das "korrekteste" Verhalten, aber es ist möglicherweise nicht möglich, wenn es mehr als ein optionales Argument gibt.Der Test für
undefined
ist der nächstbeste - er schlägt nur fehl, wenn die Funktion explizit mit einemundefined
Wert aufgerufen wird, der aller Wahrscheinlichkeit nach genauso behandelt werden sollte wie das Weglassen des Arguments.Die Verwendung des
||
Operators kann die Verwendung des Standardwerts auslösen, selbst wenn ein gültiges Argument angegeben wird. Andererseits könnte sein Verhalten tatsächlich erwünscht sein.Zusammenfassend: Verwenden Sie es nur, wenn Sie wissen, was Sie tun!
Meiner Meinung nach
||
ist die Verwendung auch der richtige Weg, wenn es mehr als ein optionales Argument gibt und man kein Objektliteral als Problemumgehung für benannte Parameter übergeben möchte.Eine andere gute Möglichkeit, Standardwerte mithilfe
arguments.length
von bereitzustellen, besteht darin, die Beschriftungen einer switch-Anweisung durchzugehen:Dies hat den Nachteil, dass die Absicht des Programmierers nicht (visuell) offensichtlich ist und "magische Zahlen" verwendet; es ist daher möglicherweise fehleranfällig.
quelle
Wenn Sie jQuery verwenden, ist eine Option, die (insbesondere in komplizierten Situationen) hilfreich ist, die Erweiterungsmethode von jQuery .
Wenn Sie die Funktion aufrufen, gehen Sie wie folgt vor:
Die Optionsvariable wäre dann:
quelle
Dies ist einer der wenigen Fälle, in denen ich den Test finde:
funktioniert ganz gut und trägt syntaktisch die richtige Implikation.
(Mit der gleichzeitigen Einschränkung, dass ich keinen legitimen Nullwert zulassen würde, der eine
argument2
andere Bedeutung hat; aber das wäre wirklich verwirrend.)BEARBEITEN:
Dies ist ein wirklich gutes Beispiel für einen stilistischen Unterschied zwischen lose und stark typisierten Sprachen. und eine stilistische Option, die Javascript in Pik bietet.
Meine persönliche Präferenz (ohne Kritik für andere Präferenzen) ist Minimalismus. Je weniger der Code zu sagen hat, solange ich konsistent und prägnant bin, desto weniger muss jemand anderes verstehen, um meine Bedeutung richtig abzuleiten.
Eine Implikation dieser Präferenz ist, dass ich nicht - ich finde es nicht nützlich - eine Reihe von Typabhängigkeitstests stapeln möchte. Stattdessen versuche ich, den Code so zu gestalten, wie er aussieht. und teste nur für das, wofür ich wirklich testen muss.
Eine der Schwierigkeiten, die ich im Code einiger anderer Leute finde, besteht darin, herauszufinden, ob sie im größeren Kontext erwarten, tatsächlich auf die Fälle zu stoßen, auf die sie testen. Oder wenn sie versuchen, alles Mögliche zu testen, mit der Möglichkeit, dass sie den Kontext nicht vollständig genug antizipieren. Das bedeutet, dass ich sie am Ende gründlich in beide Richtungen aufspüren muss, bevor ich sicher etwas umgestalten oder modifizieren kann. Ich gehe davon aus, dass es eine gute Chance gibt, dass sie diese verschiedenen Tests durchgeführt haben, weil sie Umstände vorausgesehen haben, unter denen sie gebraucht würden (und die mir normalerweise nicht klar sind).
(Ich halte das für einen schwerwiegenden Nachteil bei der Verwendung dynamischer Sprachen durch diese Leute. Zu oft möchten die Leute nicht alle statischen Tests aufgeben und sie am Ende vortäuschen.)
Ich habe dies am deutlichsten beim Vergleich von umfassendem ActionScript 3-Code mit elegantem Javascript-Code gesehen. Der AS3 kann das 3- oder 4-fache des Hauptteils des js betragen, und die Zuverlässigkeit, die ich vermute, ist zumindest aufgrund der Anzahl (3-4X) der getroffenen Codierungsentscheidungen nicht besser.
Wie Sie sagen, Shog9, YMMV. : D.
quelle
Es gibt signifikante Unterschiede. Lassen Sie uns einige Testfälle einrichten:
Bei der ersten Methode, die Sie beschreiben, verwendet nur der zweite Test den Standardwert. Die zweite Methode wird alle , aber die erste Standard (wie JS konvertiert
undefined
,null
,0
, und""
in den booleanfalse
. Und wenn Sie Tom Methode verwenden sind, nur der vierte Test den Standard verwenden!Welche Methode Sie wählen, hängt wirklich von Ihrem beabsichtigten Verhalten ab. Wenn andere Werte als
undefined
zulässig sindargument2
, möchten Sie wahrscheinlich eine Variation des ersten. Wenn ein Wert ungleich Null, nicht Null und nicht leer gewünscht wird, ist die zweite Methode ideal - tatsächlich wird sie häufig verwendet, um einen so großen Wertebereich schnell aus der Betrachtung auszuschließen.quelle
quelle
In ES6 (ES2015) können Sie Standardparameter verwenden
quelle
"default value"
und prüfen Sie, ob der Wert tatsächlich ist"default value"
.Es tut mir leid, ich kann immer noch keinen Kommentar abgeben, um Toms Antwort zu beantworten ... In Javascript (undefiniert! = Null) == false Tatsächlich funktioniert diese Funktion nicht mit "null". Sie sollten "undefiniert" verwenden.
quelle
Warum nicht den
!!
Operator benutzen ? Dieser Operator, der vor der Variablen steht, wandelt sie in einen Booleschen Wert um (wenn ich das gut verstanden habe), sodass!!undefined
und!!null
(und sogar!!NaN
, was sehr interessant sein kann) zurückkehrenfalse
.Hier ist ein Beispiel:
quelle
Es kann praktisch sein, sich der Argumenterkennung zu nähern, indem Sie Ihre Funktion mit einem Objekt mit optionalen Eigenschaften aufrufen:
quelle
Es gibt auch eine schwierige Möglichkeit festzustellen, ob ein Parameter an eine Funktion übergeben wird oder nicht . Schauen Sie sich das folgende Beispiel an:
Dies bedeutet, dass wenn der Wert von
value
nicht vorhanden ist / übergeben wird, setzen Sie ihn auf 0.Ziemlich cool, oder?
quelle
value
äquivalent zufalse
, setzen Sie es auf 0." Dies ist eine subtile, aber sehr wichtige Unterscheidung.true
undfalse
gültige Werte, und Sie möchten möglicherweise ein drittes Verhalten, wenn der Parameter überhaupt nicht übergeben wird (insbesondere, wenn die Funktion mehr als einen Parameter hat).Manchmal möchten Sie möglicherweise auch nach Typ suchen, insbesondere wenn Sie die Funktion als Getter und Setter verwenden. Der folgende Code ist ES6 (läuft nicht in EcmaScript 5 oder älter):
quelle
Weil Arrays von erben
Object.prototype
. Betrachten Sie ⇑, um die Welt besser zu machen.quelle
fnCalledFunction (Param1, Param2, window.YourOptionalParameter)
Wenn die obige Funktion von vielen Stellen aufgerufen wird und Sie sicher sind, dass die ersten beiden Parameter von jedem Ort übergeben werden, Sie sich jedoch nicht sicher sind, was den dritten Parameter betrifft, können Sie window verwenden.
window.param3 wird behandelt, wenn es nicht in der Aufrufermethode definiert ist.
quelle