在javascript中设置默认参数值的最有效方法是什么?
我知道有两种设置默认参数的方法,但我想知道首选的方法是什么在javascript中设置默认参数值的最有效方法是什么?,javascript,parameters,default-value,Javascript,Parameters,Default Value,我知道有两种设置默认参数的方法,但我想知道首选的方法是什么 function Foo(par1, par2) { if(par2 == null) par2 = "my default" } 或 还是有比这两种方法更好的方法 编辑: 我还想知道其他人如何处理多个可选参数,例如: 我们在内部库中有几个类似的函数(我认为它们非常难看) 并称之为: Foo("Parameter one",null,true) 我通常使用第二种方式,因为它增加的信号较少。从未听说过你提到的第
function Foo(par1, par2)
{
if(par2 == null)
par2 = "my default"
}
或
还是有比这两种方法更好的方法
编辑:
我还想知道其他人如何处理多个可选参数,例如:
我们在内部库中有几个类似的函数(我认为它们非常难看)
并称之为:
Foo("Parameter one",null,true)
我通常使用第二种方式,因为它增加的信号较少。从未听说过你提到的第二种方式,这很有趣。我会:
function Foo(par1, par2)
{
par2 = par2 ? par2 : 'default value';
}
但是,现在您让我注意到您的第二种方法,我想我会使用它,因为它可以减少键入量。如果您使用jquery,您可以:
function foo(params){
var params = $.extend({}, {bar: '2'}, params);
alert(params.bar);
}
foo(); //Alerts 2
第一个是错误的,因为它们是未定义的,不是空的
par2!==对于这种情况,null
将返回true
由于javascript,如果比较松散,将null、undefined、false与相同的值进行比较,我建议显式检查未定义的值
if (par2 !== undefined)
par2 = "my default";
如果(par2!==未定义)
par2=“我的默认值”;
或
par2=par2!==未定义?par2:“我的违约”;
这将允许您传递诸如false或null之类的值
但是,您的第二种方法很方便,但只有在您知道您永远不会通过false或null的情况下。并且以前有人问过问题。更好、更可靠的方法是: 1) 验证传递的参数数量(假设您希望允许传入未定义的值,或null,就像DOM insertBefore函数的情况一样),并且仅在此之后,如果ommited,请尝试设置其值: function Foo(par1, par2) { if (arguments.length < 2) par2 = "my default" else if (arguments.length < 3) par3 = "my default" } 函数Foo(par1,par2) { if(arguments.length<2) par2=“我的默认值” 其他的 如果(参数长度<3) par3=“我的默认值” } 2) 或者,如果要禁止未定义的传递,请将其包含在构造中: function Foo(par1, par2) { if (arguments.length < 2 && par2 === undefined) par2 = "my default" else if (arguments.length < 3 && par3 === undefined) par3 = "my default" } function Foo(par1, par2) { if (arguments.length < 2 && (par2 === undefined || par2 === null)) par2 = "my default" else if (arguments.length < 3 && (par3 === undefined || par3 === null)) par4 = "my default" } 函数Foo(par1,par2) { if(arguments.length<2&&par2==未定义) par2=“我的默认值” 其他的 if(arguments.length<3&&par3==未定义) par3=“我的默认值” } 3) 或者,如果不允许传递null,请将其包含在构造中: function Foo(par1, par2) { if (arguments.length < 2 && par2 === undefined) par2 = "my default" else if (arguments.length < 3 && par3 === undefined) par3 = "my default" } function Foo(par1, par2) { if (arguments.length < 2 && (par2 === undefined || par2 === null)) par2 = "my default" else if (arguments.length < 3 && (par3 === undefined || par3 === null)) par4 = "my default" } 函数Foo(par1,par2) { if(arguments.length<2&(par2==undefined | | par2==null)) par2=“我的默认值” 其他的 if(arguments.length<3&(par3==undefined | | par3==null)) par4=“我的默认值” }
顺便说一句:我建议避免使用函数重载,实际上这几乎没有必要。我所做的选择取决于参数类型和所需的默认值 例如,如果par2为false、0、空字符串、null或未定义,则这将分配“默认值”:
par2 = par2 || 'default value';
这种行为可能不是预期的或需要的。我个人认为第二种形式更干净、可读性更强,当然比sergey的参数检查更清晰——尽管这可能有它的位置——但我更喜欢为arg传递可扩展对象,而不是维护arg签名 e、 g
当你使用 var foo=bar | | 123 是计算为false的条形图的值。这可能会给你带来麻烦
Eric如果要向函数传递多个参数,可以执行以下操作:
function myFunc() {
arguments[0] = arguments[0] || "default value for first argument";
arguments[3] = arguments[3] || "default value for fourth argument";
alert(arguments[3]);
}
这个怎么样:
function myFunc(arg1, arg2, arg3) {
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
如果你的函数真的接受,null,undefined,0“,作为paramsPim,那就好了,问题是一般来说,没有关于值的细节,对吧?这不是批评。我只是说,如果你的函数不希望这些值作为参数,那么这是你不需要的。(我也对你的答案投了更高的票,因为这对于那些情况来说确实是一个很好的答案。)猜测数字或值以及其他许多东西都会被错误地对待。使用未定义,因为belowAsker正在使用==,而不是==。所以第一个例子实际上并没有错。这是可行的,但从某种意义上说,他不知道自己实际匹配的是什么,这是错误的。如果你的论点代表了一个虚假的值呢?好问题。我会使用一个类似于jishi的三元数,但我发现falsys是默认值,或者是需要传递的可疑值。有点不确定为什么我在这一个tbh上得到了接受,因为我真的用object arg技术扩展了其他正确答案:)不需要定义myArgs变量。已经有了一个内部参数变量:请参阅@some中的10.1.8节-我很清楚这一点,但是创建自己的类可以让您对数据进行集中的可重用控制,提供廉价的验证、默认值、接近类型安全性的内容(如果您愿意),并提高可读性。相比之下,参数var实际上是一个相当模糊和笨拙的。哦,更进一步说,参数[n]与myArgs.foo几乎不一样
function myFunc() {
arguments[0] = arguments[0] || "default value for first argument";
arguments[3] = arguments[3] || "default value for fourth argument";
alert(arguments[3]);
}
function myFunc(arg1, arg2, arg3) {
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}