我已经定义了一个函数:
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支持这样的语法吗?它是如何工作的?
答案 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。