11

So I've been doing this for as long as I can remember, but I'm curious if this is really what I should be doing. You write a function that takes a parameter, so you anticipate it to have a value, but if it doesn't, you have a good reason to default it, to say zero. What I currently do is write a helper function:

function foo() { return foo(0); };
function foo(bar) { ... };

I just ran across an instance where I did this and I looked at it oddly for a few seconds before understanding my logic behind it. I come from php where it's trivial:

function foo(bar=0) { ... }

Is there a javascript alternative that I'm not aware of?

1

4 Answers 4

17

You can't have overloaded functions in JavaScript. Instead, use object based initialization, or check for the values and assign a default if none supplied.

In your example, the second function foo(bar) will replace the first one.

Here's a function using object initialization.

function foo(config) {
    extend(this, config);
}

where extend is a function that merges the config object with the current object. It is similar to the $.extend method in jQuery, or $extend method of MooTools.

Invoke the function and pass it named key value pairs

foo({ bar: 0 });

The other way to initialize is to look at the supplied values, and assign a default if the value is not given

function foo(bar) {
    bar = bar || 0;
}

This works as long as bar is not a falsy value. So foo(false) or foo("") will still initialize bar to 0. For such cases, do an explicit check.

function foo(bar) {
    bar = (typeof bar == 'undefined' ? 0 : bar);
}
Sign up to request clarification or add additional context in comments.

Comments

5

In JavaScript, the argument will be undefined if the user didn't pass it in. You can use the || operator to set the value of the argument if it's undefined:

function foo(bar) {
  bar = bar || 0;
  ...
}

4 Comments

you had better check for bar === undefined instead of doing this simple test.
@jrharshath I just figure out variable===undefined is wrong just because undefined is actually a undefined variable, not a reserved word. So If you previously assign undefined=true; and then test alert(x===undefined) //returns false So you should type check using typeof variable===undefined
This answer is wrong, because you can't pass 0 nor false nor null. Exemple: If bar is true by default like this bar = bar || true you can't pass false, bar will be always true.
@Vitim.us undefined was fixed ECMAScript 5, See 15.1.1.3, released 2009 implementation chart, look for Immutable undefined The answer by Annie is wrong because of the reasons you gave above (0,false,null).
1

The simplest way I know of is test for a value and then set it to a default value if no value is found. I have not come across a catch all one liner yet, this is the best i have got.

If expecting a string value use this. Default will trigger on these values: [ undefined, null, "" ]

function foo(str) {
  str = !!str  ? str  : 'bar';
  ...
}

If expecting a number or Boolean value. This allows 0 and false as values. Default will trigger on [ undefined, null, {}, functions ]

Handy for making values arguments that only accept primitive values like number, boolean and string

function foo(val) {
  val= !!val == val || val*1 ? val : 10;
  ...
}

If you're looking to test for objects such as {}, There is documentation on doing this but it isn't so simple.

Comments

0

Hopefully this answers a bit clearer for someone - I ended up using the ol' check for undefined if(typeof functionparameter !== 'undefined') as per:

$.fn.extend({
    doThing: function(stringparameter = 'FooBar!', functionparameter){
        console.log('Here is your string '+stringparameter);
        // Run it if it's been passed through:
        if(typeof functionparameter !== 'undefined') functionparameter();
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.