Indstille en standardparameterværdi for en JavaScript-funktion

Jeg vil gerne have en JavaScript-funktion til at have valgfrie argumenter, som jeg sætter en standardværdi på, som bliver brugt, hvis værdien ikke er defineret (og ignoreres, hvis værdien er overført). I Ruby kan man gøre det på denne måde:

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

Virker det også i JavaScript?

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

Fra ES6/ES2015 findes standardparametre i sprogspecifikationen.

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

virker bare.

Reference: Standardparametre - MDN

Standardfunktionsparametre gør det muligt at initialisere formelle parametre med standardværdier, hvis ingen værdi eller undefined er overgivet.

Du kan også [simulere standardparametre med navngivne parametre via destrukturering] (http://exploringjs.com/es6/ch_parameter-handling.html#sec_named-parameters):

// 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,

Der er mange måder, men dette er min foretrukne metode - den giver dig mulighed for at indsætte alt, hvad du vil, herunder false eller null. (typeof null == "object")

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

Dette tildeler delete_after værdien af delete_after, hvis det ikke er en falsk værdi, ellers tildeles strengen "my default here". For flere detaljer kan du læse Doug Crockford's oversigt over sproget og se afsnittet om Operatorer.

Denne fremgangsmåde virker ikke, hvis du ønsker at sende en falsk værdi, dvs. false, null, undefined, 0 eller "". Hvis du har brug for false-værdier, skal du bruge metoden i Tom Ritter's svar.

Når der er tale om et antal parametre til en funktion, er det ofte nyttigt at give forbrugeren mulighed for at videregive parameterargumenterne i et objekt og derefter sammensmelte disse værdier med et objekt, der indeholder standardværdierne for funktionen

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

til brug

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

Jeg synes personligt, at noget så simpelt som dette er meget mere kortfattet og læsbart.

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

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