15

What would be the most idiomatic way to do the following in JavaScript:

If myParam is not passed into MyFunc by the caller, then I want to set it to a default value. But first I want to try and get it from another object, which may not yet exist:

function MyFunc(myParam) {

    if (!myParam) {
        if (!myObj) {
            myParam = 10;
        }
        else {
            myParam = myObj.myParam;
        }
    }
 
    alert(myParam);
}

I started to write:

myParam = myParam || myObj.mParam || 10

but realized that if myObj does not exist then this would fail. I might guess the following:

myParam = myParam || (myObj && myObj.mParam) || 10

It might even work. But is it the best way?

How would, for example, John Resig do it?

1
  • myParam = myParam || (myObj || {}).myParam || 10 Commented Sep 24, 2015 at 18:45

2 Answers 2

17

If myObj is a global it needs to reference the window object, otherwise it will throw an error if myObj is undefined.

myParam = myParam || (window.myObj ? window.myObj.mParam : 10);

or

myParam = myParam || (window.myObj && window.myObj.mParam) || 10;

This works as well:

myParam = myParam || ((typeof myObj !== "undefined") ? myObj.mParam : 10);
Sign up to request clarification or add additional context in comments.

1 Comment

Just remember that 0, empty string, null, false, NaN and undefined all are false and will in the two examples above give you the default value. In the third example you only get the default value if myObj is undefined, regardless if the myObj.mParam is assigned or not.
0

I think the other answers have proven that there are a whole bunch of ways a one-liner can fail here. My version below is perhaps more readable, and doesn't explicitly test for object/property existence, but isn't much shorter:

function MyFunc(myParam){
    if (!myParam){
        try{
            myParam = myObj.myParam;
        }
        catch(e){
            myParam = 10;
        }
    }
}

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.