Ab ES6 / ES2015 befinden sich die Standardparameter in der Sprachspezifikation.
function read_file(file, delete_after = false) {
// Code
}
funktioniert einfach.
Referenz: Standardparameter - MDN
Standardfunktionsparameter ermöglichen die Initialisierung formaler Parameter mit Standardwerten, wenn kein Wert oder undefiniert übergeben wird.
Sie können auch benannte Standardparameter über die Destrukturierung simulieren :
// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
// Use the variables `start`, `end` and `step` here
···
}
Pre ES2015 ,
Es gibt viele Möglichkeiten, aber dies ist meine bevorzugte Methode - Sie können damit alles übergeben, was Sie wollen, einschließlich false oder null. ( typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }
und dann können Sie es alsa = defaultFor(a, 42);
undefined
Objekte zu verwenden, kostenlos zusätzliche Referenzfehler erhalten : p Auch wenn es mit einigen Browsern funktioniert und möglicherweise schneller ist,null
ist es immer noch ein Objekt undundefined
verweist auf den primitiven Typ, der versucht, dies zu erkennen nichts hier, nicht einmalnull
. Siehe hier, beide Fälle auf den Punkt gebracht: JavaScript / Reference / Global_Objects / undefined .typeof
ist dies redundant.function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }
Dies wirft keine Referenzfehler und ist prägnant.a = a
undb = b
wann diese Parameter nicht undefiniert sind. Außerdem kann dieser ternäre Operator mit einem etwas komplizierten Zustand für zukünftige Betreuer schwer zu lesen sein. Ich würde die folgende Syntax bevorzugen:if (typeof a == 'undefined') a = 42
- Keine unnötige Zuordnung und etwas leichter zu lesen.typeof
? Es scheint einfacher zu sein, es einfach zu tuna === undefined
. Auf diese Weise erhalten Sie einen Referenzfehler, wenn Sie falsch geschrieben oderundefined
in eine Zeichenfolge eingefügt haben.Dies wird
delete_after
dem Wert zugewiesen,delete_after
wenn es sich nicht um einen Falsey- Wert handelt, andernfalls wird die Zeichenfolge zugewiesen"my default here"
. Weitere Informationen finden Sie in Doug Crockfords Umfrage zur Sprache und im Abschnitt über Operatoren .Dieser Ansatz funktioniert nicht, wenn Sie in einem übergeben wollen Falsey Wert , dh
false
,null
,undefined
,0
oder""
. Wenn Sie die Übergabe von Falsey- Werten benötigen , müssen Sie die Methode in Tom Ritters Antwort verwenden .Wenn sie mit einer Reihe von Parametern zu einer Funktion zu tun, ist es oft sinnvoll , die Verbraucher zu ermöglichen , die Parameterargumente in einem Objekt zu übergeben und dann zusammenführen , diese Werte mit einem Objekt , das die Standardwerte für die Funktion enthält
benutzen
quelle
delete_after
das boolesche Ergebnis des Ausdrucks nicht erhalten wirddelete_after || "my default value"
?Ich finde so etwas Einfaches viel prägnanter und persönlich lesbarer.
quelle
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
. Die Verwendung des in dieser Antwort gezeigten globalen Namespace wird von vielen als schlechte Praxis angesehen. Sie können auch in Betracht ziehen, Ihr eigenes Dienstprogramm für diese allgemeine Aufgabe zu rollen (z. B.util.default(arg, "defaul value")
), wenn Sie keinen Unterstrich verwenden möchten, aber ich verwende meistens früher oder später Unterstrich, um das Rad neu zu erfinden.undefined
mit einem anderen Wert zu überschreiben , was dazu führte, dass der Test fehlschlug.undefined
. Es ist also immer noch eine gute Idee,typeof
und zu verwenden'undefined'
.In ECMAScript 6 können Sie tatsächlich genau das schreiben, was Sie haben:
Dies wird eingestellt
delete_after
,false
wenn es nicht vorhanden ist oderundefined
. Sie können ES6-Funktionen wie diese heute mit Transpilern wie Babel verwenden .Weitere Informationen finden Sie im MDN-Artikel .
quelle
Standardparameterwerte
Mit ES6 können Sie möglicherweise eine der häufigsten Redewendungen in
JavaScript
Bezug auf das Festlegen eines Standardwerts für einen Funktionsparameter ausführen. Die Art und Weise, wie wir dies seit Jahren tun, sollte ziemlich vertraut aussehen:Dieses Muster wird am häufigsten verwendet, ist jedoch gefährlich, wenn wir Werte wie übergeben
Warum? Weil das
0 is falsy
und damit dasx || 11 results in 11
nicht direkt in 0 übergeben wird. Um dieses Problem zu beheben, schreiben einige Leute den Scheck stattdessen ausführlicher wie folgt:Wir können jetzt eine nette hilfreiche Syntax untersuchen, die ab hinzugefügt wurde
ES6
, um die Zuweisung von Standardwerten zu fehlenden Argumenten zu optimieren:x = 11
in einer Funktionsdeklaration ist mehr wiex !== undefined ? x : 11
die viel allgemeinere Redewendungx || 11
Standardwertausdrücke
Function
Standardwerte können mehr als nur einfache Werte wie 31 sein. Sie können ein beliebiger gültiger Ausdruck sein, sogar einfunction call
:Wie Sie sehen können, werden die Standardwertausdrücke träge ausgewertet. Dies bedeutet, dass sie nur ausgeführt werden, wenn sie benötigt werden, dh wenn das Argument eines Parameters weggelassen oder undefiniert ist.
Ein Standardwertausdruck kann sogar ein Inline-Funktionsausdrucksaufruf sein - im Allgemeinen als sofort aufgerufener Funktionsausdruck bezeichnet
(IIFE)
:quelle
Diese Lösung ist Arbeit für mich in js:
quelle
delete_after
ist0
odernull
? In diesen Fällen funktioniert es nicht richtig.delete_after = delete_after === undefined ? false : delete_after
?Verwenden Sie einfach einen expliziten Vergleich mit undefined.
quelle
Ich würde äußerste Vorsicht empfehlen, wenn Sie Standardparameterwerte in Javascript verwenden. Es schafft oft Fehler , wenn , wie in Verbindung mit Funktionen höherer Ordnung verwendet
forEach
,map
undreduce
. Betrachten Sie beispielsweise diese Codezeile:parseInt hat einen optionalen zweiten Parameter
function parseInt(s, [
radix=10])
, ordnet jedoch AufrufeparseInt
mit drei Argumenten zu: ( Element , Index und Array ).Ich schlage vor, Sie trennen Ihre erforderlichen Parameter von Ihren optionalen / standardmäßigen Argumenten. Wenn Ihre Funktion 1,2 oder 3 erforderliche Parameter verwendet, für die kein Standardwert sinnvoll ist, machen Sie sie zu Positionsparametern für die Funktion. Alle optionalen Parameter sollten als benannte Attribute eines einzelnen Objekts folgen. Wenn Ihre Funktion 4 oder mehr benötigt, ist es möglicherweise sinnvoller, alle Argumente über Attribute eines einzelnen Objektparameters anzugeben.
In Ihrem Fall würde ich vorschlagen, dass Sie Ihre deleteFile-Funktion wie folgt schreiben: ( bearbeitet per
instead
's Kommentare ) ...Das Ausführen des obigen Snippets zeigt die Gefahren, die hinter Standardargumentwerten für nicht verwendete Parameter lauern.
quelle
typeof deleteAfter === 'bool'
und ansonsten eine Ausnahme auszulösen. Wenn Sie Methoden wie map / foreach usw. verwenden, verwenden Sie diese nur mit Vorsicht und verpacken Sie aufgerufene Funktionen mit anonymen Funktionen.['1', '2', '3'].map((value) => {read_file(value);})
get
Methode von lodash verwenden, um deleteAfter abzurufen. Eine Ausnahme auszulösen, wenn diestypeof 'deleteAfter' !== 'bool'
auch eine gute umsichtige Maßnahme sein kann. Ich mag es nicht, Methoden zu entwerfen, bei denen der Aufrufer "Vorsicht walten lassen" muss. Vorsicht liegt in der Verantwortung der Funktion, nicht des Anrufers. Das Endverhalten sollte dem Prinzip der geringsten Überraschung folgen.Als Update ... mit ECMAScript 6 können Sie ENDLICH Standardwerte in Funktionsparameterdeklarationen wie folgt festlegen:
Wie von - http://es6-features.org/#DefaultParameterValues angegeben
quelle
Als langjähriger C ++ - Entwickler (Anfänger in der Webentwicklung :)) habe ich, als ich zum ersten Mal auf diese Situation stieß, die Parameterzuweisung in der Funktionsdefinition wie in der Frage erwähnt wie folgt vorgenommen.
Beachten Sie jedoch, dass dies in allen Browsern nicht konsistent funktioniert. Für mich funktionierte es auf meinem Desktop mit Chrome, auf Android jedoch nicht mit Chrome. Sicherere Option, wie viele oben erwähnt haben, ist -
Die Absicht für diese Antwort ist nicht, die gleichen Lösungen zu wiederholen, die andere bereits erwähnt haben, sondern zu informieren, dass die Parameterzuweisung in der Funktionsdefinition in einigen Browsern möglicherweise funktioniert, sich jedoch nicht darauf verlässt.
quelle
function myfunc(a,b=10)
ob es sich um eine ES6-Syntax handelt, finden Sie in anderen Antworten Links zu Kompatibilitätstabellen.Verwenden Sie für alle, die daran interessiert sind, dass dort Code in Microsoft Edge funktioniert, keine Standardeinstellungen für Funktionsparameter.
In diesem Beispiel gibt Edge den Fehler "Expecting ')'" aus.
Um diese Verwendung zu umgehen
Ab dem 08. August 2016 ist dies immer noch ein Problem
quelle
Gemäß der Syntax
Sie können den Standardwert für formale Parameter definieren. Überprüfen Sie auch den undefinierten Wert mithilfe der Funktion typeof .
quelle
quelle
Verwenden Sie diese Option, wenn Sie die neueste
ECMA6
Syntax verwenden möchten :Es heißt
default function parameters
. Es ermöglicht die Initialisierung formaler Parameter mit Standardwerten, wenn kein Wert oder undefiniert übergeben wird. HINWEIS : Es funktioniert nicht mit Internet Explorer oder älteren Browsern.Verwenden Sie für maximale Kompatibilität Folgendes:
Beide Funktionen haben genau das gleiche Verhalten wie jedes dieser Beispiele. Dies hängt davon ab, dass die Parametervariable lautet,
undefined
wenn beim Aufrufen dieser Funktion kein Parameterwert übergeben wurde.quelle
ES6: Wie bereits in den meisten Antworten erwähnt, können Sie in ES6 einfach einen Parameter zusammen mit einem Wert initialisieren.
ES5: Die meisten der gegebenen Antworten sind nicht gut genug für mich , denn es gibt Gelegenheiten , wo ich zu können Falsey Werte wie passieren
0
,null
undundefined
zu einer Funktion. Um festzustellen, ob ein Parameter undefiniert ist, weil dies der Wert ist, den ich anstelle von undefiniert übergeben habe, weil er überhaupt nicht definiert wurde, gehe ich folgendermaßen vor:quelle
Hier ist foo () eine Funktion mit einem Parameter namens argValue. Wenn wir hier im Funktionsaufruf nichts übergeben, wird die Funktion throwIfNoValue () aufgerufen und das zurückgegebene Ergebnis dem einzigen Argument argValue zugewiesen. So kann ein Funktionsaufruf als Standardparameter verwendet werden. Das macht den Code einfacher und lesbarer.
Dieses Beispiel wurde von hier genommen
quelle
Wenn Sie verwenden
ES6+
, können Sie Standardparameter wie folgt einstellen:Wenn Sie eine
ES5
Syntax benötigen , können Sie dies folgendermaßen tun:In der obigen Syntax wird der
OR
Operator verwendet. DerOR
Operator gibt immer den ersten Wert zurück, wenn dieser konvertiert werden kann,true
wenn nicht, gibt er den rechten Wert zurück. Wenn die Funktion ohne entsprechendes Argument aufgerufen wird, wird die Parametervariable (bar
in unserem Beispiel)undefined
von der JS-Engine auf gesetzt.undefined
Wird dann in false konvertiert und gibt derOR
Operator somit den Wert 0 zurück.quelle
Ja, die Verwendung von Standardparametern wird in ES6 vollständig unterstützt :
oder
Vor ES5 war dies jedoch problemlos möglich:
Das heißt, wenn der Wert vorhanden ist, verwenden Sie den Wert, andernfalls verwenden Sie den zweiten Wert nach der
||
Operation, der dasselbe tut ...Hinweis: Es gibt auch einen großen Unterschied zwischen diesen, wenn Sie einen Wert an ES6 übergeben , selbst wenn der Wert falsch ist, der durch einen neuen Wert ersetzt wird, etwa
null
oder""
... aber ES5 1 wird nur ersetzt, wenn nur der übergebene Wert ist wahr, das liegt daran, wie die||
Arbeitsweise ...quelle
Wenn aus irgendeinem Grund Sie sind nicht auf ES6 und sind mit
lodash
hier ist eine kurze Art und Weise Funktionsparameter über auf die_.defaultTo
Standardmethode:Hiermit wird der Standardwert festgelegt, wenn der aktuelle Wert NaN , null oder undefiniert ist
quelle
Klänge der Zukunft
In Zukunft können Sie ein Objekt auf ein anderes "verteilen" (derzeit ab 2019 NICHT von Edge unterstützt !) - eine Demonstration, wie Sie dies für nette Standardoptionen unabhängig von der Reihenfolge verwenden können:
MDN-Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
... währenddessen unterstützt Edge DOES Object.assign () (IE nicht, aber ich hoffe wirklich, dass wir IE zurücklassen können :))
Ebenso könnten Sie tun
BEARBEITEN: Aufgrund von Kommentaren zu
const
Optionen - das Problem bei der Verwendung konstanter Optionen im Rest der Funktion besteht eigentlich nicht darin, dass Sie dies nicht tun können, sondern nur darin, dass Sie die konstante Variable nicht in ihrer eigenen Deklaration verwenden können - hätten Sie um die Eingangsbenennung an etwas wie anzupassenquelle
function(opt){ const opt = /*some merging*/; }
? Das wird sicher nicht funktionieren, da Sie eineconst
Variable verwenden würden , bevor sie deklariert wurde - Sie müssten anpassen -function test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
Um auch meine Fähigkeiten zu demonstrieren (lol), kann die obige Funktion auch ohne die folgenden Argumente geschrieben werden:
ES5 und höher
ES6 und höher
quelle
Der folgende Code funktioniert möglicherweise in dieser Situation, einschließlich ECMAScript 6 (ES6) sowie früherer Versionen.
Der Standardwert in Sprachen funktioniert, wenn der Parameterwert der Funktion beim Aufruf übersprungen wird. In JavaScript wird er undefiniert zugewiesen . Dieser Ansatz sieht programmatisch nicht attraktiv aus, ist jedoch abwärtskompatibel .
quelle
Ja, dies wird als Standardparameter bezeichnet
Standardfunktionsparameter ermöglichen die Initialisierung formaler Parameter mit Standardwerten, wenn kein Wert oder undefiniert übergeben wird.
Syntax:
Beschreibung:
Die Parameter der Funktionen sind standardmäßig undefiniert. In Situationen kann es jedoch hilfreich sein, einen anderen Standardwert festzulegen. Hier können Standardparameter helfen.
In der Vergangenheit bestand die allgemeine Strategie zum Festlegen von Standardeinstellungen darin, Parameterwerte im Hauptteil der Funktion zu testen und einen Wert zuzuweisen, wenn sie nicht definiert sind. Wenn im Aufruf kein Wert angegeben wird, ist sein Wert undefiniert. Sie müssten eine bedingte Prüfung festlegen, um sicherzustellen, dass der Parameter nicht undefiniert ist
Mit den Standardparametern in ES2015 ist die Überprüfung im Funktionskörper nicht mehr erforderlich. Jetzt können Sie einfach einen Standardwert in den Funktionskopf einfügen.
Beispiel für die Unterschiede:
Verschiedene Syntaxbeispiele:
Auffüllen undefiniert gegen andere falsche Werte:
Selbst wenn der Wert beim Aufruf explizit festgelegt wird, ist der Wert des Argumentes num der Standardwert.
Zum Zeitpunkt des Anrufs ausgewertet:
Das Standardargument wird beim Aufruf ausgewertet. Im Gegensatz zu einigen anderen Sprachen wird bei jedem Aufruf der Funktion ein neues Objekt erstellt.
Standardparameter stehen für spätere Standardparameter zur Verfügung:
Bereits angetroffene Parameter stehen späteren Standardparametern zur Verfügung
Im Funktionskörper definierte Funktionen:
Eingeführt in Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Im Funktionskörper deklarierte Funktionen können nicht innerhalb der Standardparameter referenziert werden und lösen einen ReferenceError aus (derzeit ein TypeError in SpiderMonkey, siehe Fehler 1022967). Standardparameter werden immer zuerst ausgeführt, Funktionsdeklarationen innerhalb des Funktionskörpers werden anschließend ausgewertet.
Parameter ohne Standardwerte nach Standardparametern:
Vor Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2) führte der folgende Code zu einem SyntaxError. Dies wurde im Fehler 777060 behoben und funktioniert wie erwartet in späteren Versionen. Die Parameter werden weiterhin von links nach rechts festgelegt, wodurch Standardparameter überschrieben werden, auch wenn spätere Parameter ohne Standardwerte vorhanden sind.
Zerstörter Parameter mit Standardwertzuweisung:
Sie können die Standardwertzuweisung mit der Notation der Destrukturierungszuweisung verwenden
quelle
Ein anderer Ansatz zum Festlegen von Standardparametern besteht darin, die Objektzuordnung von Argumenten anstelle von Argumenten direkt zu verwenden. Zum Beispiel,
Auf diese Weise ist es einfach, die Argumente zu erweitern und sich keine Sorgen über die Nichtübereinstimmung der Argumentlänge zu machen.
quelle
Die Antwort ist ja. Tatsächlich gibt es viele Sprachen, die Standardparameter unterstützen. Python ist einer von ihnen:
Obwohl dies aufgrund der Klammern Python 3-Code ist, funktionieren Standardparameter in Funktionen auch in JS.
Zum Beispiel und in Ihrem Fall:
Aber manchmal brauchen Sie nicht wirklich Standardparameter.
Sie können die Variable direkt nach dem Start der Funktion wie folgt definieren:
In beiden meiner Beispiele wird dasselbe zurückgegeben. Aber manchmal können sie tatsächlich nützlich sein, wie in sehr fortgeschrittenen Projekten.
Zusammenfassend können also Standardparameterwerte in JS verwendet werden. Es ist jedoch fast dasselbe wie das Definieren einer Variablen direkt nach dem Start der Funktion. Manchmal sind sie jedoch immer noch sehr nützlich. Wie Sie vielleicht bemerkt haben, benötigen Standardparameterwerte 1 Codezeile weniger als die Standardmethode, mit der der Parameter direkt nach dem Start der Funktion definiert wird.
EDIT: Und das ist super wichtig! Dies wird nicht in IE arbeiten. Siehe Dokumentation . Im IE müssen Sie also die Methode "Variable oben in der Funktion definieren" verwenden. Standardparameter funktionieren im IE nicht.
quelle
Ja, dies funktioniert in Javascript. Sie können das auch tun:
quelle