我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:

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

这在JavaScript中有效吗?

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

当前回答

答案是肯定的。事实上,有许多语言支持默认参数。Python就是其中之一:

def(a, enter="Hello"):
   print(a+enter)

尽管由于括号的原因,这是Python 3代码,但函数中的默认参数也可以在JS中使用。

例如,在您的案例中:

函数read_file(file,deleteAfter=false){console.log(deleteAfter);}read_file(“test.txt”);

但有时您实际上不需要默认参数。

您可以在函数开始后立即定义变量,如下所示:

函数read_file(文件){var deleteAfter=false;console.log(deleteAfter);}read_file(“test.txt”);

在我的两个示例中,它都返回相同的结果。但有时它们确实会有用,比如在非常先进的项目中。

因此,总之,可以在JS中使用默认参数值。但这与在函数开始后定义变量几乎是一样的。然而,有时它们仍然非常有用。正如您可能注意到的那样,默认参数值比在函数开始后定义参数的标准方法少1行代码。

编辑:这非常重要!这在IE中不起作用。请参阅文档。因此,对于IE,您必须使用“在函数顶部定义变量”方法。默认参数在IE中不起作用。

其他回答

function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

如果delete_after的值不是假值,则将其赋值给delete_aafter,否则将赋值字符串“我的默认值”。有关更多详细信息,请查看DougCrockford的语言调查,并查看操作员部分。

如果要传入假值,即false、null、undefined、0或“”,则此方法不起作用。如果需要传入假值,则需要使用Tom Ritter的答案中的方法。

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

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

是的,ES6完全支持使用默认参数:

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

or

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

但在ES5之前,您可以轻松做到这一点:

function read_file(file, delete_after) {
  var df = delete_after || false;
  // Code
}

这意味着如果值存在,则使用该值,否则,在执行相同操作的||操作之后使用第二个值。。。

注意:如果你将一个值传递给ES6,它们之间也有很大的区别,即使值是假的,也会被新值替换,比如null或“”。。。但是ES5只有在传递的值为真时才会被替换,这是因为工作方式。。。

未来之声

将来,您将能够将一个对象“散布”到另一个对象(目前截至2019年,Edge不支持!)-演示如何将其用于良好的默认选项,而不考虑顺序:

功能测试(选项){var选项={//默认值url:'defaultURL',some:“somethingDefault”,//使用输入选项覆盖…选项};var body=document.getElementsByTagName('body')[0];body.innerHTML+='<br>'+options.url+':'+options.some;}测试();测试({});测试({url:'myURL'});测试({some:'somethingOfMine');测试({url:'overrideURL',some:'andSomething'});测试({url:'overrideURL',一些:'andSomething',额外:'noProblem'});

MDN参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

…同时,Edge支持的是Object.assign()(IE不支持,但我真的希望我们可以将IE留在后面:)

同样,你也可以这样做

功能测试(选项){var options=对象分配({//默认值url:'defaultURL',some:“somethingDefault”,},选项);//使用输入选项覆盖var body=document.getElementsByTagName('body')[0];body.innerHTML+='<br>'+options.url+':'+options.some;}测试();测试({});测试({url:'myURL'});测试({some:'somethingOfMine');测试({url:'overrideURL',some:'andSomething'});测试({url:'overrideURL',一些:'andSomething',额外:'noProblem'});

编辑:由于对常量选项的评论-在函数的其余部分使用常量选项的问题实际上并不是你不能做到这一点,而是你不能在它自己的声明中使用常量变量-你必须将输入命名调整为

function test(input_options){
   const options = {
     // defaults
     someKey:    'someDefaultValue',
     anotherKey: 'anotherDefaultValue',

     // merge-in input options
     ...input_options
   };

   // from now on use options with no problem
}

ES6:正如大多数答案中已经提到的,在ES6中,您可以简单地初始化一个参数和一个值。


ES5:大多数给出的答案对我来说都不够好,因为在某些情况下,我可能不得不向函数传递假值,例如0、null和undefined。要确定参数是否未定义,因为这是我传递的值,而不是未定义的值,因为根本没有定义,我执行以下操作:

function foo (param1, param2) {
   param1 = arguments.length >= 1 ? param1 : "default1";
   param2 = arguments.length >= 2 ? param2 : "default2";
}

如果出于某种原因,您不在ES6上,并且正在使用lodash,那么这里有一种通过_.defaultTo方法默认函数参数的简洁方法:

var fn=函数(a,b){a=_.defaultTo(a,'Hi')b=_.defaultTo(b,'妈妈!')控制台日志(a,b)}fn()//嗨,妈妈!fn(未定义,空)//嗨,妈妈!fn(NaN,NaN)//嗨,妈妈!fn(1)//1“妈妈!”fn(空,2)//高2fn(假,假)//假-假fn(0,2)//0 2<script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js“></script>

如果当前值为NaN、null或undefined,将设置默认值