ES6的参数名称?

时间:2015-09-02 12:28:52

标签: javascript ecmascript-6 keyword-argument

我已经定义了一个函数:

function call_api(url, callback, query = {}, body = {})

我期待一种语法,我可以提供正文和跳过查询:

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

但我必须使用此解决方法:

call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2})

即使我提供body=,它也会显示为query参数。我使用Babel和Webpack。我在Chrome控制台和Webpack源代码中尝试了语法。

ES6支持这样的语法吗?它是如何工作的?

4 个答案:

答案 0 :(得分:22)

我建议您通过传递对象并对对象使用解构来解决此问题:

function callApi({url, callback, query = {}, body = {}})

然后将其称为:

callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}})

这会给你类似于你想要的语法。

已经考虑并拒绝了JavaScript的命名参数,这与其他语言(如C#和Python)不同。来自语言邮件列表的Here is a recent discussion about it

答案 1 :(得分:2)

this site所示,默认值仅适用于需要默认值的参数(如选项参数),但不适用于跳过'参数。

你要做的是

viewer.html?file=pdfFiles/mypdf.pdf

无论您的默认值如何,ES6仍然会认为您的定义的c是定义的c。
所以不,ES6没有这样的语法。

答案 2 :(得分:2)

您无法指定在通话中指定的参数。

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

等效于在函数外部设置一个名为body的变量,然后在查询参数的位置传递它的值。

您可以使用解构来实现您想要的目标。

function call_api(url, callback, {query = {}, body = {}} = {})

然后在你的电话中你会这样做

call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})

答案 3 :(得分:1)

看到默认参数值仅在参数未定义时使用,“跳过”参数并回退到默认值的唯一方法是在其中发送undefined

call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2})

示例:Babel REPL

在这种情况下,函数中query的值将为{}(或者您设置的默认值)。

当您想通过传递空值来使用默认参数值时,这有点类似于what Visual Basic does。 (例如sub name(argument 1, , , argument 4)

否则,如果你想要支持命名参数,最好的妥协是@Benjamin Gruenbaum提供的答案。

更新:您可能会找到this article provides an option using the arguments keyword,或者更好的是,您可以iterate over the ES6 ...rest parameters collection在Javascript中模拟overloaded function