为JavaScript函数设置一个默认参数值

我想让一个JavaScript函数有一些可选参数,我在这些参数上设置了一个默认值,如果没有定义这个值,这些参数就会被使用(如果通过了这个值,就会被忽略)。在Ruby中,你可以这样做。

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

这在JavaScript中是否可行?

function read_file(file, delete_after = false) {
  // Code
}
解决办法

ES6/ES2015来看,默认参数是在语言规范中。

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

就可以了。

参考资料。默认参数 - MDN

默认函数参数允许在无值未定义时用默认值初始化正式参数。

你也可以通过去结构化来模拟默认的**名参数

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

ES2015之前

有很多方法,但这是我首选的方法--它可以让你传入任何你想要的东西,包括false或null。(typeof null == "object")

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

这是给delete_after赋值,如果它不是一个falsey的值,否则它赋值为字符串"我的默认值在这里"。更多细节,请查看Doug Crockford'的语言调查,并查看操作符部分

如果你想传入一个falsey的值,即falsenullundefined0"",这种方法就不起作用。如果你需要传入falsey值,你需要使用Tom Ritter's answer中的方法。

当处理一个函数的许多参数时,允许消费者在一个对象中传递参数参数,然后将这些值与一个包含函数默认值的对象*合并,这通常是有用的。

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

来使用

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

我觉得像这样简单的东西,个人认为更简明,更有可读性。

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

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