Идиоматический способ установить значение по умолчанию в JavaScript - PullRequest
15 голосов
/ 03 февраля 2009

Какой самый идиоматичный способ сделать следующее в 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

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

Как, например, Джон Резиг сделал бы это?

Ответы [ 2 ]

17 голосов
/ 03 февраля 2009

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

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

или

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

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

myParam = myParam || ((typeof myObj !== "undefined") ? myObj.mParam : 10);
0 голосов
/ 03 февраля 2009

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

function MyFunc(myParam){
    if (!myParam){
        try{
            myParam = myObj.myParam;
        }
        catch(e){
            myParam = 10;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...