我总是像这样在 JavaScript 中处理可选参数:
function myFunc(requiredArg, optionalArg){
optionalArg = optionalArg || 'defaultValue';
// Do stuff
}
有没有更好的方法来做到这一点?
有没有||
像这样使用会失败的情况?
我总是像这样在 JavaScript 中处理可选参数:
function myFunc(requiredArg, optionalArg){
optionalArg = optionalArg || 'defaultValue';
// Do stuff
}
有没有更好的方法来做到这一点?
有没有||
像这样使用会失败的情况?
如果通过 optionalArg,您的逻辑将失败,但评估为 false - 试试这个作为替代
if (typeof optionalArg === 'undefined') { optionalArg = 'default'; }
或者另一种习语:
optionalArg = (typeof optionalArg === 'undefined') ? 'default' : optionalArg;
使用最能向您传达意图的习语!
在ECMAScript 2015(又名“ ES6 ”)中,您可以在函数声明中声明默认参数值:
function myFunc(requiredArg, optionalArg = 'defaultValue') {
// do stuff
}
在 MDN 上的这篇文章中有更多关于它们的信息。
目前仅 Firefox 支持,但随着标准的完成,预计支持会迅速改进。
编辑(2019-06-12):
现代浏览器现在广泛支持默认参数。并非
所有版本的 Internet Explorer都不支持此功能。但是,Chrome、Firefox和Edge目前支持它。
我发现这是最简单、最易读的方式:
if (typeof myVariable === 'undefined') { myVariable = 'default'; }
//use myVariable here
保罗迪克森的回答(以我的拙见)比这更难读,但这归结为偏好。
insin 的答案要先进得多,但对大功能更有用!
编辑 2013 年 11 月 17 日下午 9:33:我为 Node.js 创建了一个包,它可以更轻松地“重载”称为参数的函数(方法)。
如果您需要插入文字NULL
,那么您可能会遇到一些问题。除此之外,不,我认为你可能在正确的轨道上。
有些人选择的另一种方法是采用一个关联的变量数组,遍历参数列表。它看起来更整洁,但我想它有点(非常少)更多的进程/内存密集型。
function myFunction (argArray) {
var defaults = {
'arg1' : "value 1",
'arg2' : "value 2",
'arg3' : "value 3",
'arg4' : "value 4"
}
for(var i in defaults)
if(typeof argArray[i] == "undefined")
argArray[i] = defaults[i];
// ...
}
理想情况下,您会重构以传递一个对象并将其与一个默认对象合并,因此传递参数的顺序并不重要(请参阅下面此答案的第二部分)。
但是,如果您只想要快速、可靠、易于使用且不笨重的东西,请尝试以下操作:
undefined
给具有默认值的参数,这样,变量将设置为undefined
. 此页面上的大多数其他选项将替换undefined
为默认值。这是为三个可选参数提供默认值的示例(带有两个必需参数)
function myFunc( requiredA, requiredB, optionalA, optionalB, optionalC ) {
switch (arguments.length - 2) { // 2 is the number of required arguments
case 0: optionalA = 'Some default';
case 1: optionalB = 'Another default';
case 2: optionalC = 'Some other default';
// no breaks between cases: each case implies the next cases are also needed
}
}
简单的演示。这类似于roenving's answer,但很容易扩展为任意数量的默认参数,更容易更新,并且使用arguments
notFunction.arguments
。
上面的代码,像许多处理默认参数的方法一样,不能乱序传递参数,例如,传递optionalC
但离开optionalB
以回退到其默认值。
一个不错的选择是传递对象并与默认对象合并。这也有利于可维护性(只需注意保持您的代码可读,这样未来的合作者就不会猜测您传递的对象的可能内容)。
使用 jQuery 的示例。如果您不使用 jQuery,则可以改用 Underscore_.defaults(object, defaults)
或浏览以下选项:
function myFunc( args ) {
var defaults = {
optionalA: 'Some default',
optionalB: 'Another default',
optionalC: 'Some other default'
};
args = $.extend({}, defaults, args);
}