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:
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
.
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.