Establecer un valor de parámetro por defecto para una función de JavaScript

Me gustaría que una función de JavaScript tuviera argumentos opcionales en los que establezco un valor por defecto, que se utilizan si el valor no está definido (y se ignoran si se pasa el valor). En Ruby se puede hacer así:

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

¿Funciona esto en JavaScript?

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

Desde ES6/ES2015, los parámetros por defecto están en la especificación del lenguaje.

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

simplemente funciona.

Referencia: Parámetros por defecto - MDN

Los parámetros por defecto de las funciones permiten que los parámetros formales sean inicializados con valores por defecto si no hay valor o indefinido es pasado.

También puede simular parámetros por defecto nombrados mediante desestructuración:

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

Hay muchas formas, pero este es mi método preferido: te permite pasar lo que quieras, incluyendo false o null. (typeof null == "object")

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

Esto asigna a delete_after el valor de delete_after si no es un valor falso, de lo contrario asigna la cadena "mi defecto aquí". Para más detalles, consulte Doug Crockford's survey of the language and check out the section on Operators.

Este enfoque no funciona si quiere pasar un valor falsey, es decir, false, null, undefined, 0 o `"". Si necesita pasar valores falseados tendrá que utilizar el método de Tom Ritter's answer.

Cuando se trata de un número de parámetros a una función, a menudo es útil permitir al consumidor pasar los argumentos del parámetro en un objeto y luego fusionar estos valores con un objeto que contenga los valores por defecto para la función

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

a utilizar

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

Personalmente, encuentro que algo sencillo como esto es mucho más conciso y legible.

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

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