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

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

这在JavaScript中有效吗?

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

当前回答

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


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

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

其他回答

这个解决方案在js中很适用:

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

我强烈建议在javascript中使用默认参数值时格外小心。当它与forEach、map和reduce等高阶函数一起使用时,通常会产生错误。例如,考虑以下代码行:

['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

parseInt有一个可选的第二参数函数parseInt(s,[radix=10]),但map调用parseInt3个参数:(元素、索引和数组)。

我建议您将所需参数与可选/默认值参数分开。如果您的函数采用了1、2或3个所需的参数,而默认值没有意义,请将它们设置为函数的位置参数,任何可选参数都应作为单个对象的命名属性。如果您的函数需要4个或更多,那么通过单个对象参数的属性提供所有参数可能更有意义。

在您的情况下,我建议您像这样编写deleteFile函数:(按注释编辑)。。。

//不安全的函数read_file(fileName,deleteAfter=false){if(删除后){console.log(`读取并删除${fileName}`);}其他{console.log(`正在读取${fileName}`);}}//更好函数readFile(文件名,选项){const deleteAfter=!!(options&&options.deleteAfter==true);read_file(文件名,删除后);}console.log('nsafe…');['log1.txt','log2.txt','log3.txt'].map(读取文件);console.log('better…');['log1.txt','log2.txt','log3.txt'].map(readFile);

运行上面的代码片段说明了未使用参数的默认参数值背后隐藏的危险。

function helloWorld(name, symbol = '!!!') {
    name = name || 'worlds';
    console.log('hello ' + name + symbol);
}

helloWorld(); // hello worlds!!!

helloWorld('john'); // hello john!!!

helloWorld('john', '(>.<)'); // hello john(>.<)

helloWorld('john', undefined); // hello john!!!

helloWorld(undefined, undefined); // hello worlds!!!

作为一名长期的C++开发人员(web开发新手:),当我第一次遇到这种情况时,我在函数定义中进行了参数赋值,就像问题中提到的那样,如下所示。

function myfunc(a,b=10)

但要注意,它在不同浏览器之间并不一致。对我来说,它在我的桌面上运行,但在android上不运行。更安全的选择,正如上面提到的那样-

    function myfunc(a,b)
    {
    if (typeof(b)==='undefined') b = 10;
......
    }

这个答案的意图不是重复其他人已经提到的相同解决方案,而是告知函数定义中的参数分配可能在某些浏览器上有效,但不要依赖它。

答案是肯定的。事实上,有许多语言支持默认参数。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中不起作用。