Skip to content

Instantly share code, notes, and snippets.

@klovadis
Created April 29, 2012 10:03
Show Gist options
  • Star 41 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save klovadis/2549131 to your computer and use it in GitHub Desktop.
Save klovadis/2549131 to your computer and use it in GitHub Desktop.
How to use optional arguments in node.js
// example function where arguments 2 and 3 are optional
function example( err, optionalA, optionalB, callback ) {
// retrieve arguments as array
var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}
// first argument is the error object
// shift() removes the first item from the
// array and returns it
err = args.shift();
// last argument is the callback function.
// pop() removes the last item in the array
// and returns it
callback = args.pop();
// if args still holds items, these are
// your optional items which you could
// retrieve one by one like this:
if (args.length > 0) optionalA = args.shift(); else optionalA = null;
if (args.length > 0) optionalB = args.shift(); else optionalB = null;
// continue as usual: check for errors
if (err) return callback(err);
// for tutorial purposes, log the optional parameters
console.log('optionalA:', optionalA);
console.log('optionalB:', optionalB);
/* do your thing */
} // example()
// invoke example function with and without optional arguments
example(null, function (err) { /* do something */ });
example(null, 'AA', function (err) {});
example(null, 'AAAA', 'BBBB', function (err) {});
@rohanorton
Copy link

@dandv Array.prototype.push.apply(args, arguments); works nicely for me

@nuxibyte
Copy link

nice. thanks.

@rossipedia
Copy link

@dandv why not just var args = [].slice.call(arguments); ?

@adrianblynch
Copy link

How do you know if optionalA or optionalB is intended?

If your pattern is function(required, optional, required) or function(required, optional, optional) I think it's OK to deal with those the way you have or any other way, but if you have a funcation signature like function(required, optional_1, optional_2, required) you have no way of telling what the user meant to send, function(required, optional_1, required) or function(required, optional_2, required)

Or have I missed something?

@mduleone
Copy link

mduleone commented Nov 6, 2014

@adrianblynch That's only the case if optional_1 and optional_2 are independent. If you structure your inputs to function in such a way where optional_2 can be present only if optional_1 is present (even if that requires sending function(required, null, optional_2, required), you don't have to worry about that.

If the signature is function(required, optional_1, optional_2) where optional_1 and optional_2 are independent of each other and you pass in function(required, optional_2), unless you design your input to match specific unique criterion, you're right: there's no way to for the function know that you mean optional_2 instead of optional_1.

Long Story Short: design your function to require optional_1 in order to accept optional_2.

@thinklinux
Copy link

Cool. Thanks!

@giri-sh
Copy link

giri-sh commented Jan 22, 2016

I get Error: SyntaxError: Unexpected string where the arguments is used. If i remove it, everything seems to work fine. Any help please? Thanks

@mexxik
Copy link

mexxik commented Feb 10, 2016

thanks

@gugonzar
Copy link

gugonzar commented Jun 3, 2020

Thank you @klovadis and @rossipedia !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment