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?

Alex
  • 1,457
  • 1
  • 13
  • 26
Mike
  • 1,625
  • 16
  • 29

2 Answers2

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);
Luca Matteis
  • 29,161
  • 19
  • 114
  • 169
  • 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. – some Feb 03 '09 at 03:59
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;
        }
    }
}
Kenan Banks
  • 207,056
  • 34
  • 155
  • 173