Ustaw domyślną wartość parametru dla funkcji JavaScript

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
}
Rozwiązanie

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';
  ...
}
Komentarze (26)
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" }); 
Komentarze (17)

Osobiście uważam, że coś tak prostego jest o wiele bardziej zwięzłe i czytelne.

function pick(arg, def) {
   return (typeof arg == 'undefined' ? def : arg);
}

function myFunc(x) {
  x = pick(x, 'my default');
} 
Komentarze (7)