在javascript中设置默认参数值的最有效方法是啥?
Posted
技术标签:
【中文标题】在javascript中设置默认参数值的最有效方法是啥?【英文标题】:What is the most efficient method of setting default parameter values in javascript?在javascript中设置默认参数值的最有效方法是什么? 【发布时间】:2010-10-02 11:06:18 【问题描述】:我知道设置默认参数的两种方法,但我想知道首选方法是什么。
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)
【问题讨论】:
【参考方案1】:我通常使用第二个,因为它增加的信号较少。
【讨论】:
【参考方案2】:从来没有听说过你提到的第二种方式,这很有趣。我会这样做:
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
【讨论】:
【参考方案4】:第一个实际上是错误的,因为它们是未定义的,而不是 null。
par2 !== null
在这种情况下会返回 true。
由于 javascript,如果松散比较,将 null、undefined、false 与相同的值进行比较,我建议明确检查未定义的值。
如果 (par2 !== 未定义) par2 = "我的默认值";或
par2 = par2 !== 未定义? par2 : "我的默认值";这将允许您传递 false 或 null 等值。
但是,您的第二种方法很方便,但仅在您知道永远不会传递 false 或 null 的情况下。
【讨论】:
提问者使用 ==,而不是 ===。所以第一个例子其实没有错。 它会起作用,但在他不知道他实际匹配什么的意义上这是错误的。【参考方案5】:Similar 和 related 之前已经提出过问题。
【讨论】:
【参考方案6】:更好、更可靠的方法是:
1) 验证传递的参数数量(假设您希望允许传入未定义的值或 null,就像在 DOM insertBefore 函数的情况下一样),并且只有在此之后尝试设置它们的值(如果省略):
函数 Foo(par1, par2) if (arguments.length2) 或者,如果您想禁止传递 undefined,请将其包含在构造中:
函数 Foo(par1, par2) if (arguments.length3) 或者,如果您想禁止传递 null,请将其包含在构造中:
函数 Foo(par1, par2) if (arguments.length顺便说一句:我建议避免使用函数重载,实际上几乎没有必要。
【讨论】:
如果您的函数确实接受 null, undefined, 0, '' 作为参数,那就太好了 Pim,问题很笼统,没有关于值的详细信息,对吧? 这不是批评。我只是说,如果您的函数不希望这些值作为参数,那么您并不真正需要它。 (我也赞成您的回答,因为对于这些情况来说,这确实是一个很好的答案。)【参考方案7】:我所做的选择取决于参数类型和所需的默认值。
例如,如果 par2 为 false、0、空字符串、null 或未定义,这将分配“默认值”:
par2 = par2 || 'default value';
这种行为可能不是预期或要求的。
【讨论】:
【参考方案8】:就我个人而言,我认为第二种形式更简洁、更易读,当然比 sergey 的参数检查更重要——尽管它可以占据一席之地——但我更喜欢为 args 传递可扩展对象,而不是必须维护 arg 签名。
例如
function Foo(myArgs)
myArgs.par1 = myArgs.par1 || "my default"
myArgs.par2 = myArgs.par2 || "my default"
【讨论】:
如果你的论点代表一个虚假值怎么办? 好问题。我会在重要的地方使用类似于 jishi 的三元 - 但大多数情况下我发现 falsys 是 默认值,或者根本是有问题的值。有点不确定为什么我在这个 tbh 上被接受了,因为我真的用对象 arg 技术扩展了其他正确的答案:) 无需定义 myArgs 变量。已经有一个内部参数变量:参见ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf中的第 10.1.8 节 @some - 我很清楚这一点,但是创建您自己的类可以让您对数据进行集中的可重用控制,为您提供廉价的验证、默认值、接近类型安全的东西(如果您愿意的话),并且提高可读性。相比之下,参数 var 确实是一个相当模糊和笨拙的参数。 哦,更进一步 - arguments[n] 与 myArgs.foo 几乎不一样【参考方案9】:使用解决方案时你要考虑的一件事
var foo = bar || 123;
是什么 bar 的值评估为 false。这可能会给您带来麻烦。
埃里克
【讨论】:
【参考方案10】:如果您将许多参数传递给函数,您可以执行以下操作:
function myFunc()
arguments[0] = arguments[0] || "default value for first argument";
arguments[3] = arguments[3] || "default value for fourth argument";
alert(arguments[3]);
【讨论】:
【参考方案11】:这个呢:
function myFunc(arg1, arg2, arg3)
switch (arguments.length)
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
【讨论】:
以上是关于在javascript中设置默认参数值的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章