Definir um valor de parâmetro padrão para uma função JavaScript

Eu gostaria que uma função JavaScript tivesse argumentos opcionais que eu definiria como padrão, que são usados se o valor for't definido (e ignorado se o valor for passado). Em Ruby você pode fazê-lo assim:

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

Isto funciona em JavaScript?

function read_file(file, delete_after = false) {
  // Code
}
Solução

A partir de ES6/ES2015, os parâmetros padrão estão na especificação do idioma.

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

apenas funciona.

Referência: Parâmetros Padrão - MDN

Os parâmetros da função padrão permitem que os parâmetros formais sejam inicializados com valores padrão se nenhum valor ou finido for passado.

Você também pode simular parâmetros padrão nome via desestruturação:

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

Há muitas maneiras, mas este é o meu método preferido - permite que você passe o que quiser, incluindo falso ou nulo. (typeof null == "object")

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

Isto atribui a delete_after o valor de delete_after se não for um valor falsey senão atribui a string "meu padrão aqui". Para mais detalhes, confira Doug Crockford's survey of the language e veja a seção sobre Operadores.

Esta abordagem não funciona se você quiser passar em um valor falso, ou seja, falso, nulo, finito, 0 ou "". Se você precisar que valores falsey sejam passados em você precisaria usar o método em resposta de Tom Ritter.

Quando se lida com uma série de parâmetros para uma função, muitas vezes é útil permitir que o consumidor passe os argumentos dos parâmetros em um objeto e depois merge esses valores com um objeto que contenha os valores padrão para a função

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

para usar

// 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" }); 
Comentários (17)

Eu acho algo simples como isto muito mais conciso e legível pessoalmente.

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

function myFunc(x) {
  x = pick(x, 'my default');
} 
Comentários (7)