我知道有两种设置默认参数的方法,但我想知道首选方法是什么。
function Foo(par1, par2)
{
if(par2 == null)
par2 = "my default"
}
或
function Foo(par1, par2)
{
par2 = par2 || "my default"
}
还是有比这两种方法更好的方法吗?
编辑:
我还想知道其他人如何处理多个可选参数,例如: 我们在内部库中有几个这样的函数(我认为它们非常难看)。
function Foo(par1, par2, par3)
{
if(par2 == null)
par2 = "my default"
if(par3 == null)
par3 = "my default"
// Do something
}
并称之为:
Foo("Parameter one",null,true)
答案 0 :(得分:5)
第一个实际上是错误的,因为它们将是未定义的,而不是空的。
对于这种情况, par2 !== null
将返回true。
因为javascript,如果松散比较,将null,undefined,false比较为相同的值,我建议明确检查未定义的值。
if (par2 !== undefined) par2 = "my default";
或
par2 = par2 !== undefined ? par2 : "my default";
这将允许您传递false或null等值。
但是,您的第二种方法很方便,但只有在您知道永远不会传递false或null的情况下。
答案 1 :(得分:4)
更好,更可靠的方法是:
1)验证传递的参数数量(假设您希望允许传入未定义的值,或者为null,就像DOM insertBefore函数一样),并且只有在尝试并设置其值(如果ommited)之后:
function Foo(par1, par2) { if (arguments.length < 2) par2 = "my default" else if (arguments.length < 3) par3 = "my default" }
2)或者,如果您想禁止传递undefined,请将其包含在构造中:
function Foo(par1, par2) { if (arguments.length < 2 && par2 === undefined) par2 = "my default" else if (arguments.length < 3 && par3 === undefined) par3 = "my default" }
3)或者,如果您想禁止传递null,请将其包含在构造中:
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" }
BTW:我建议避免使用函数重载,实际上几乎没有必要。
答案 2 :(得分:3)
我通常使用第二个,因为它增加的信号较少。
答案 3 :(得分:2)
就我个人而言,我认为第二种形式只是彻底清晰,更具可读性,当然比sergey的参数检查更多 - 虽然可以有它的位置 - 但我更喜欢传递args的可扩展对象,而不是维护arg签名。
e.g。
function Foo(myArgs)
{
myArgs.par1 = myArgs.par1 || "my default"
myArgs.par2 = myArgs.par2 || "my default"
}
答案 4 :(得分:2)
这个怎么样:
function myFunc(arg1, arg2, arg3) {
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
答案 5 :(得分:1)
答案 6 :(得分:1)
我做出的选择取决于参数类型和所需的默认值。
例如,如果par2为false,0,空字符串,null或undefined,则会分配'default value':
par2 = par2 || 'default value';
这种行为可能不是预期或要求的。
答案 7 :(得分:0)
从未听说过你提到的第二种方式,这很有趣。我愿意:
function Foo(par1, par2)
{
par2 = par2 ? par2 : 'default value';
}
但是现在你引起我的注意了你的第二种方法,我想我会使用它只是因为它不那么打字。
答案 8 :(得分:0)
如果你使用jquery,你可以这样做:
function foo(params){
var params = $.extend({}, {bar: '2'}, params);
alert(params.bar);
}
foo(); //Alerts 2
答案 9 :(得分:0)
使用
解决方案时必须考虑的一件事var foo = bar || 123;
是评估为false的bar的值。这可能会让你遇到问题。
埃里克
答案 10 :(得分:0)
如果您将许多参数传递给函数,则可以执行以下操作:
function myFunc() {
arguments[0] = arguments[0] || "default value for first argument";
arguments[3] = arguments[3] || "default value for fourth argument";
alert(arguments[3]);
}