Рекомендуемый способ обработки обязательных и дополнительных параметров функции - PullRequest
1 голос
/ 06 марта 2012

У меня есть функция javascript, которая принимает два параметра: «ключ» и «значение».

Если указан только один параметр, то параметру «ключ» присваивается значение по умолчанию и неопределенное «значение».Параметр получает значение параметра «ключ».

function thingSet(key,value){
    if(typeof value === 'undefined'){
        value=key;
        key='_default';
    }
    //... use key and value
}

Код работает, но по какой-то причине я чувствую себя немного неловко.

Есть ли лучшие способы сделать это?

Ответы [ 6 ]

2 голосов
/ 06 марта 2012

Это довольно стандартный и широко используемый механизм «перегрузки» в javascript. Вы найдете это во всех библиотеках, таких как jQuery.

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

Сила достигается ценой надежности. Если вы используете этот вид трюков, вы должны убедиться, что все понимают подразумеваемый API и используют его соответствующим образом.

2 голосов
/ 06 марта 2012

Вы можете изменить его следующим образом:

function thingSet (key, value) {
    key = key || '_default';
    value = value || key;
    //... use key and value
}

Это хорошая оценка короткого замыкания, позволяющая легко устанавливать значения по умолчанию.

1 голос
/ 06 марта 2012

Вы можете установить значения по умолчанию следующим образом:

function thingSet(key,value){
    key = key || '_default';
    value = value || key;
    //... use key and value
}

По крайней мере, это то, что я делаю для вашей функции.Беспокойство может быть связано с тем, что в вашей функции key также может быть undefined, и в этом случае назначение после проверки условия if(typeof value === 'undefined') все еще может привести к undefined value

Вы можете проверить наличие хотя бы одного параметра, используя arguments.length.

function thingSet(key,value){
    if (!arguments.length) {
       alert('please supply at least one parameter'); 
       return true;
    }
    key = key || '_default';
    value = value || key;
    //... use key and value
}
0 голосов
/ 06 марта 2012

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

function setName(opt) {
    if (typeof opt != "object") {
        var p = opt.split(" ");
        opt = { first: p[0], last: p[1] };
    }
    $.extend(this, opt);
}

Может использоваться как person.setName('John Doe') или person.setName({last:'Doe'})

0 голосов
/ 06 марта 2012

Обычно я делаю это с JSON

myfunction = function(args){
    args.key =  (typof(args.key) == "undefined")?args.key = "_default":args.key;
    args.value =  (typof(args.value) == "undefined")?args.key:args.value;
}

myfunction({key:"something",value:"something else"})

, чтобы вы знали, какую переменную вы передаете в функцию, и не нужно ничего предполагать внутри функции.

0 голосов
/ 06 марта 2012

Кажется, хорошо для меня.Единственное, что я бы сделал по-другому, - это более прямое сравнение по значению:

if(value == undefined){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...