Ideally, you would refactor to pass an object and merge it with a default object, so the order in which arguments are passed doesn't matter (see the second section of this answer, below).
If, however, you just want something quick, reliable, easy to use and not bulky, try this:
A clean quick fix for any number of default arguments
- It scales elegantly: minimal extra code for each new default
- You can paste it anywhere: just change the number of required args and variables
- If you want to pass
undefined
to an argument with a default value, this way, the variable is set as undefined
. Most other options on this page would replace undefined
with the default value.
Here's an example for providing defaults for three optional arguments (with two required arguments)
function myFunc( requiredA, requiredB, optionalA, optionalB, optionalC ) {
switch (arguments.length - 2) { // 2 is the number of required arguments
case 0: optionalA = 'Some default';
case 1: optionalB = 'Another default';
case 2: optionalC = 'Some other default';
// no breaks between cases: each case implies the next cases are also needed
}
}
Simple demo. This is similar to roenving's answer, but easily extendible for any number of default arguments, easier to update, and using arguments not Function.arguments.
Passing and merging objects for more flexibility
The above code, like many ways of doing default arguments, can't pass arguments out of sequence, e.g., passing optionalC
but leaving optionalB
to fall back to its default.
A good option for that is to pass objects and merge with a default object. This is also good for maintainability (just take care to keep your code readable, so future collaborators won't be left guessing about the possible contents of the objects you pass around).
Example using jQuery. If you don't use jQuery, you could instead use Underscore's _.defaults(object, defaults)
or browse these options:
function myFunc( args ) {
var defaults = {
optionalA: 'Some default',
optionalB: 'Another default',
optionalC: 'Some other default'
};
args = $.extend({}, defaults, args);
}
Here's a simple example of it in action.