ES6 的参数名称?

Parameter names with ES6?

我定义了这样一个函数:

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支持这样的语法吗?它是如何工作的?

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

你想做的是

// function definition
function hi(a,b,c,d)

// function call
hi(a,b,d)

ES6 仍然会认为你的 'd' 是定义的 c,不管你的默认值如何。
所以不,ES6 没有这样的语法。

您不能在调用中指定分配给哪个参数。

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

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

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 来自语言邮件列表。

看到默认参数值仅在参数未定义时使用,"skip" 参数并回退到默认值的唯一方法是在其位置发送 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 提供的答案。


更新: 您可能会在 Javascript.

中找到 this article provides an option using the arguments keyword, or better yet, you could iterate over the ES6 ...rest parameters collection to simulate an overloaded function