Een standaard parameterwaarde instellen voor een JavaScript-functie

Ik zou graag willen dat een JavaScript functie optionele argumenten heeft waar ik een default op zet, die gebruikt worden als de waarde niet gedefinieerd is (en genegeerd worden als de waarde wel wordt doorgegeven). In Ruby kun je dat als volgt doen:

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

Werkt dit ook in JavaScript?

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

Vanaf ES6/ES2015 staan standaardparameters in de taalspecificatie.

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

werkt gewoon.

Referentie: Standaard Parameters - MDN

Default functie parameters maken het mogelijk om formele parameters te initialiseren met standaard waarden indien geen waarde of undefined wordt doorgegeven.

U kunt ook standaard naam parameters simuleren via destructurering:

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

Vor ES2015,

Er zijn veel manieren, maar dit is de methode die mijn voorkeur heeft - je kunt er alles mee doen wat je wilt, inclusief false of null. (typeof null == "object")

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

Dit wijst aan delete_after de waarde van delete_after toe als het geen valse waarde is anders wijst het de string "my default here" toe. Voor meer details, zie Doug Crockford's overzicht van de taal en bekijk de sectie over Operators.

Deze aanpak werkt niet als je een falsey waarde wilt doorgeven, d.w.z. false, null, undefined, 0 of "". Als u falsey waarden wilt doorgeven zou u de methode in Tom Ritter's antwoord moeten gebruiken.

Wanneer je te maken hebt met een aantal parameters voor een functie, is het vaak handig om de gebruiker de parameterargumenten in een object te laten doorgeven en dan samen te voegen deze waarden met een object dat de standaardwaarden voor de functie bevat

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

te gebruiken

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

Persoonlijk vind ik zoiets eenvoudigs veel beknopter en leesbaarder.

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

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