Chciałbym, aby funkcja JavaScript miała opcjonalne argumenty, które ustawiam domyślnie, które są używane, jeśli wartość nie jest zdefiniowana (i ignorowane, jeśli wartość jest przekazywana). W Ruby możesz to zrobić w ten sposób:
def read_file(file, delete_after = false)
# code
end
Czy to działa w JavaScript?
function read_file(file, delete_after = false) {
// Code
}
Od ES6/ES2015, domyślne parametry są w specyfikacji języka.
function read_file(file, delete_after = false) {
// Code
}
po prostu działa.
Odnośnik: Default Parameters - MDN
Parametry domyślne funkcji pozwalają na inicjalizację parametrów formalnych wartościami domyślnymi, jeśli przekazano brak wartości lub niezdefiniowane.
Możesz również symulować domyślne nazwane parametry poprzez destrukturyzację:
// 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
···
}
Przed ES2015,
Istnieje wiele sposobów, ale jest to moja preferowana metoda - pozwala ci przekazać wszystko, co chcesz, w tym false lub null. (typeof null == "object"
)
function foo(a, b) {
a = typeof a !== 'undefined' ? a : 42;
b = typeof b !== 'undefined' ? b : 'default_b';
...
}
function read_file(file, delete_after) {
delete_after = delete_after || "my default here";
//rest of code
}
To przypisuje delete_after
wartość delete_after
, jeśli nie jest to wartość falsey, w przeciwnym razie przypisuje łańcuch "my default here"
. Aby uzyskać więcej szczegółów, sprawdź Doug Crockford's survey of the language and check out the section on Operators.
To podejście nie działa, jeśli chcesz przekazać wartość false, tzn. false
, null
, undefined
, 0
lub ""
. Jeśli wymagasz, aby wartości false były przekazywane, musisz użyć metody z Odpowiedź Toma Rittera.
Kiedy mamy do czynienia z wieloma parametrami funkcji, często przydatne jest umożliwienie konsumentowi przekazania argumentów parametrów w obiekcie, a następnie merge tych wartości z obiektem, który zawiera wartości domyślne dla funkcji
function read_file(values) {
values = merge({
delete_after : "my default here"
}, values || {});
// rest of code
}
// simple implementation based on $.extend() from jQuery
function merge() {
var obj, name, copy,
target = arguments[0] || {},
i = 1,
length = arguments.length;
for (; i < length; i++) {
if ((obj = arguments[i]) != null) {
for (name in obj) {
copy = obj[name];
if (target === copy) {
continue;
}
else if (copy !== undefined) {
target[name] = copy;
}
}
}
}
return target;
};
do użycia
// will use the default delete_after value
read_file({ file: "my file" });
// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" });