Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中设置默认参数值的最有效方法是什么?_Javascript_Parameters_Default Value - Fatal编程技术网

在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";
    }
}