Reputation: 23098
I have defined a function like:
function call_api(url, callback, query = {}, body = {})
I expected a syntax where I can provide body and skip query:
call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})
But I have to use this workaround:
call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2})
Even if I provide body=
, it appears its appearing as the query
parameter. I use Babel with Webpack. I tried the syntax in Chrome console and in Webpack source.
Is such a syntax supported by ES6? How does it work?
Upvotes: 32
Views: 13443
Reputation: 9440
Seeing that the default parameter value is only used when the parameter is undefined, the only way to "skip" a parameter and fall back to the default would be to send undefined
in it's place:
call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2})
Example: Babel REPL
The value of query
within the function will be {}
(or whatever you set default to) in this case.
This would be somewhat similar to what Visual Basic does when you want to use the default parameter value by passing an empty value. (e.g. sub name(argument 1, , , argument 4)
)
Otherwise, if you wanted support for named parameters, the best compromise would be the answer supplied by @Benjamin Gruenbaum.
Update: You might find 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 in Javascript.
Upvotes: 1
Reputation: 276406
I recommend that you work around this with passing an object and using destructuring for objects:
function callApi({url, callback, query = {}, body = {}})
And then call it as:
callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}})
Which would give you syntax similar to the one you want.
Named arguments have been considered and rejected for JavaScript, unlike other languages like C# and Python which sport them. Here is a recent discussion about it from the language mailing list.
Upvotes: 40
Reputation: 1241
You can't specify which parameter you assign to in your call.
call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})
Is equivalent to setting a variable named body outside of the function and then passing its value in the query parameter's spot.
You could use destructuring to achieve what you want though.
function call_api(url, callback, {query = {}, body = {}} = {})
Then in your call you would do this
call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})
Upvotes: 2
Reputation: 1314
As shown on this site, the defaults are just for parameters that need a default value (like an options parameter), but not for 'skipping' parameters.
What you're trying to do is
// function definition
function hi(a,b,c,d)
// function call
hi(a,b,d)
ES6 is still going to think that your 'd', is the defined c, regardless of your default value.
So no, ES6 does not have such syntax.
Upvotes: 3