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
我定义了这样一个函数:
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 thearguments
keyword, or better yet, you could iterate over the ES6 ...rest
parameters collection to simulate an overloaded function