Skip to content

Instantly share code, notes, and snippets.

Created April 29, 2012 10:03
What would you like to do?
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++) {
// 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) {});
Copy link

jferrero commented Dec 4, 2013


Copy link

dandv commented Apr 17, 2014

Can we optimize the for loop by replacing it with Array.prototype.push.apply(args, arguments); ?

Copy link

I had to remove undefined elements from the array as I kept on getting undefined is not a function error when trying to use the callback. Inserted this at line 9 and it seems to work a charm.

args = args.filter(function (val) {
  return val !== undefined;

Copy link

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

Copy link

nice. thanks.

Copy link

@dandv why not just var args = []; ?

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?

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.

Copy link

Cool. Thanks!

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

Copy link

mexxik commented Feb 10, 2016


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