Impostare un valore di parametro predefinito per una funzione JavaScript

Vorrei che una funzione JavaScript avesse degli argomenti opzionali su cui impostare un default, che vengono usati se il valore non è definito (e ignorati se il valore viene passato). In Ruby si può fare così:

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

Questo funziona in JavaScript?

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

Da ES6/ES2015, i parametri predefiniti sono nella specifica del linguaggio.

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

funziona e basta.

Riferimento: Parametri predefiniti - MDN

I parametri predefiniti delle funzioni permettono ai parametri formali di essere inizializzati con valori predefiniti se viene passato nessun valore o undefined.

Potete anche simulare parametri predefiniti nominati tramite destrutturazione:

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

Ci sono molti modi, ma questo è il mio metodo preferito - ti permette di passare qualsiasi cosa tu voglia, incluso false o null. (typeof null == "object")

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

Questo assegna a delete_after il valore di delete_after se non è un valore falso altrimenti assegna la stringa "my default here". Per maggiori dettagli, date un'occhiata a Doug Crockford'indagine sul linguaggio e controllate la sezione sugli operatori.

Questo approccio non funziona se vuoi passare un valore falso, cioè false, null, undefined, 0 o "". Se si richiede di passare valori falsi, è necessario utilizzare il metodo in Tom Ritter'risposta.

Quando si ha a che fare con un certo numero di parametri di una funzione, è spesso utile permettere al consumatore di passare gli argomenti dei parametri in un oggetto e poi fondere questi valori con un oggetto che contiene i valori predefiniti per la funzione

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

da usare

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

Personalmente trovo che qualcosa di semplice come questo sia molto più conciso e leggibile.

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

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