建议的方法来处理必需和可选的功能参数

时间:2012-03-06 11:26:26

标签: javascript function

我有一个javascript函数,它有两个参数,'key'和'value'。

如果只给出一个参数,那么'key'参数将被赋予默认值,未定义的'value'参数将获得'key'参数值。

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

代码有效,但出于某种原因我感到不安。

有更好的方法吗?

6 个答案:

答案 0 :(得分:2)

你可以像这样重构:

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

这是一个很好的短路评估,可以让你轻松设置默认值。

答案 1 :(得分:2)

这是非常标准的,并且在javascript中大量使用“重载”机制。你可以在像jQuery这样的库中找到它。

与许多动态语言结构一样,编译器可以检查您的内容与您必须保留的内容之间存在差距,可能会将其记录下来。

强大的代价是强大的。如果你使用这种技巧,你必须确保每个人都理解隐含的API并相应地使用它。

答案 2 :(得分:1)

您可以设置如下默认值:

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
}

答案 3 :(得分:0)

对我来说似乎很好。我唯一做的就是对价值进行更直接的比较:

if(value == undefined){

答案 4 :(得分:0)

我通常使用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"})

通过这种方式,您可以知道要传递给函数的变量,而不必从函数中承担任何内容。

答案 5 :(得分:0)

很难在虚拟示例上讨论设计问题,但我更喜欢一个总是接受一个参数的函数,它可以是一个简单的值,也可以是一个值的散列。考虑这个稍微更现实的例子:

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'})