Установка значения по умолчанию неопределенной переменной в JavaScript

В идеале я хочу иметь возможность написать что-то вроде:

function a( b ) {
    b.defaultVal( 1 );
    return b;
}

Намерение этого состоит в том, что если b любое определенное значение, b останется как это значение; но если b не определено, то b будет установлено значение, указанное в параметре defaultVal(), в этом случае 1,

Это вообще возможно?

Я играл с чем-то вроде этого:

String.prototype.defaultVal=function(valOnUndefined){
    if(typeof this==='undefined'){
        return valOnUndefined;
    }else{
        return this;
    }
};

Но у меня нет успеха в применении такой логики к любой переменной, особенно к неопределенным переменным.

У кого-нибудь есть мысли по этому поводу? Это можно сделать? Или я лаю не на том дереве?

3 ответа

Решение

Ну, самая важная вещь, чтобы узнать здесь, если переменная undefined у вас по умолчанию нет доступных методов. Таким образом, вам нужно использовать метод, который может работать с переменной, но не является членом / методом этой переменной.

Попробуйте что-то вроде:

function defaultValue(myVar, defaultVal){
    if(typeof myVar === "undefined") myVar = defaultVal;
    return myVar;
}

То, что вы пытаетесь сделать, является эквивалентом этого:

undefined.prototype.defaultValue = function(val) { }

... Который по понятным причинам не работает.

Почему бы не использовать оператор по умолчанию:

function someF(b)
{
    b = b || 1;
    return b;
}

Работа выполнена! Вот больше информации о том, как это работает.

Как примечание: ваш прототип не будет работать, потому что вы увеличиваете String прототип, тогда как если ваша переменная не определена, String прототип не совсем подходит.

Чтобы быть абсолютно супер-уверен, что вы переключаетесь только на значение по умолчанию, когда b на самом деле не определено, вы можете сделать это:

var someF = (function(undefined)//get the real undefined value
{
    return function(b)
    {
        b = b === undefined ? 1 : b;
        return b;
    }
})(); // by not passing any arguments

Несмотря на то, что оба ответа верны, язык с тех пор прогрессировал. Если ваши целевые браузеры поддерживают его, вы можете использовать параметры функции по умолчанию, например:

function greetMe(greeting = "Hello", name = "World") {
  console.log(greeting + ", " + name + "!");
}

greetMe(); // prints "Hello, World!"
greetMe("Howdy", "Tiger"); // prints "Howdy, Tiger!"

Вот документы MDN по параметрам функций по умолчанию.

Другие вопросы по тегам