Nastavitev privzete vrednosti parametra za funkcijo JavaScript

Želim, da ima funkcija JavaScript neobvezne argumente, za katere nastavim privzeto vrednost, ki se uporabi, če vrednost ni določena (in se ne upošteva, če je vrednost posredovana). V jeziku Ruby lahko to storite takole:

def read_file(file, delete_after = false)
  # code
end

Ali to deluje tudi v javascriptu?

function read_file(file, delete_after = false) {
  // Code
}
Rešitev

Iz ES6/ES2015 so privzeti parametri v specifikaciji jezika.

function read_file(file, delete_after = false) {
  // Code
}

samo deluje.

Referenca: Privzeti parametri - MDN

Privzeti parametri funkcij omogočajo inicializacijo formalnih parametrov s privzetimi vrednostmi, če je posredovana brez vrednosti ali nedoločeno.

Lahko tudi simulirate privzete imenovane parametre z destrukturiranjem:

// 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
    ···
}

Pred ES2015,

Načinov je veliko, vendar mi je ta metoda najljubša - omogoča, da vnesete vse, kar želite, vključno z false ali null. (typeof null == "object")

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}
Komentarji (26)
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

To dodeli delete_after vrednost delete_after, če to ni falsey vrednost, sicer dodeli niz "my default here". Za več podrobnosti si oglejte Doug Crockford'pregled jezika in si oglejte razdelek o operatorjih.

Ta pristop ne deluje, če želite posredovati falično vrednost, tj. false, null, undefined, 0 ali "". Če želite, da se posredujejo vrednosti falsey, morate uporabiti metodo iz odgovora Toma Ritterja.

Kadar imamo opravka s številnimi parametri funkcije, je pogosto koristno, da uporabniku omogočimo, da argumente parametrov posreduje v objektu, nato pa te vrednosti spoji z objektom, ki vsebuje privzete vrednosti za funkcijo

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;
};

za uporabo

// 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" }); 
Komentarji (17)

Osebno se mi zdi, da je nekaj tako preprostega veliko bolj jedrnato in berljivo.

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

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