Идиоматический способ установки значения по умолчанию в javascript

Какой был бы самый идиоматический способ сделать следующее в javascript:

Если myParam не передается в MyFunc вызывающим, тогда я хочу установить его значение по умолчанию. Но сначала я хочу попробовать и получить его от другого объекта, который может еще не существовать:

function MyFunc(myParam) {

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

    alert(myParam);
}

Я начал писать:

    myParam = myParam || myObj.mParam || 10

но понял, что если myObj не существует, это может потерпеть неудачу. Я мог бы предположить следующее:

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

Это может даже сработать. Но это лучший способ?

Как, например, Джон Ресиг?

Ответы

Ответ 1

Если myObj является глобальным, ему необходимо ссылаться на объект окна, иначе он выдает ошибку, если myObj - undefined.

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

или

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

Это также работает:

myParam = myParam || ((typeof myObj !== "undefined") ? myObj.mParam : 10);

Ответ 2

Я думаю, что другие ответы доказали, что существует целый ряд способов, с помощью которых один лайнер может потерпеть неудачу. Моя версия ниже, возможно, более читаема и явно не проверяет существование объекта/свойства, но не намного короче:

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