我有一个javascript函数,它有两个参数,'key'和'value'。
如果只给出一个参数,那么'key'参数将被赋予默认值,未定义的'value'参数将获得'key'参数值。
function thingSet(key,value){
if(typeof value === 'undefined'){
value=key;
key='_default';
}
//... use key and value
}
代码有效,但出于某种原因我感到不安。
有更好的方法吗?
答案 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'})