JavaScript函数:可选参数

8

我是从Python转到JavaScript的新手。在Python中,参数可以按键和值的方式传递,例如:

def printinfo( name, age = 35 ):
   print "Name: ", name
   print "Age ", age
   return;

那么该函数可以这样调用:
printinfo( age=50, name="miki" )
printinfo( name="miki" )

能够将这些参数传递到JavaScript函数中吗?
我希望能够传递一个或多个参数。例如,一个如下的JavaScript函数:
function plotChart(data, xlabel, ylabel, chart_type="l"){
    ...
} 

我希望只需要传递数据,图表类型和标签可以选择性地添加,例如:

plotChart(data, chart_type="pie")

这是否可能使用JavaScript实现?

1
请在谷歌上搜索“JavaScript 可选参数”或“JavaScript 命名参数”。 - user663031
@Mike,你听说过ES6吗? - user663031
@torazburo 没有,但我刚刚读了Moogs的链接。谢谢! - Mike
1
@jfriend00 不确定那是一个精确的重复,而且无论如何它都没有处理命名参数的问题。 - user663031
1
@torazaburo - 我在引用的重复答案中添加了有关命名参数和ES6默认参数值的信息。 - jfriend00
显示剩余5条评论
4个回答

14

一个不错的做法是使用一个对象来保存所有参数,类似这样:

function plotChart(options) {
  // Set defaults
  options.chart_type = options.chart_type || '1';

  // Check if each required option is set
  // Whatever is used by the data
}

然后当函数被调用时:

plotChart({
  data: 'some data',
  xlabel: 'some xlabel',
  ylabel: 'some ylabel',
  chart_type: '5' // This is optional
});

这个答案比我的更进一步,所以我推荐它。这也有一个好处,就是可以轻松地构建参数。JS没有重载,所以如果你预见到一个函数在未来会经历大量的变化,或者需要传递超过1-2个参数,通常最好让它取一个对象。+1 - Sinistralis
这绝对是“最佳”选择,而我现在经常使用它。 - TheTechy

6

一种方法是检查参数值是否为undefined,如果是,则赋一个值。

function plotChart(data, xlabel, ylabel, chart_type) {
  if (typeof chart_type === 'undefined') {
     chart_type = 'l';
  }
} 

此外,EcmaScript 2016 (ES6) 提供了默认参数Default Parameters。由于一些浏览器尚未支持此功能,您可以使用转译器babel将代码转换为 ES5。
为使其像 Python 示例中那样工作,您需要传递包含值的对象,而不是单个参数。
function plotChart(options) {
    var data = options.data;
    var xlabel = options.xlabel;
    var ylabel = options.ylabel;
    var chart_type = (typeof options.chart_type === 'undefined' ? 'l' : options.chart_type);
}

使用示例

plotChart({
  xlabel: 'my label',
  chart_type: 'pie'
});

一个完整的答案(已经存在于SO上)将展示chart_type = chart_type || "1";的经典模式。 - user663031
5
在Ruby中,这种写法几乎总是可以的,但在JavaScript中,你需要注意变量可能具有虚值域中任意一个虚值的情况。通常而言这样做没问题,但每次都要考虑一下;if (typeof(chart_type) == "undefined") chart_type = "1" 是安全的写法。 - Amadan
2
@torazaburo,我不喜欢那个模式,因为在某些情况下,您可能希望实际传递一个值为0falsey。我想对于这个问题来说还好,但我不想让事情变得复杂。 - Miguel Mota
当你想要第一个参数具有默认值时,问题就出现了。如果你给 data 设置默认值,那么你将无法使用它,因为如果你省略 data 参数并且第一个参数用于 xlabel,则实际上是将 data 设置为你在 xlabel 中想要的值。 - Sam
@Moogs 是的,我并不是建议在所有情况下都使用它,显然不能在可能传递 falsy 值的情况下使用它,但在参数被省略或为对象的情况下,这是一个常见的习惯用法,这就是为什么我说值得一提。 - user663031

3

这个问题已经有很多答案了,但我还没有看到我认为最简单的解决方案。

var myFunc = function(param1) {
    var someData = param1 || "defaultValue";
}

2
请查看Moogs的回答下面的评论,了解为什么这不是很好。 - Amadan
取决于您期望的参数,但这肯定是一个有效的观点。我很少处理可以为0的值,所以这是我经常使用的一种模式。无论如何,可以有理由不遵循异常模式。 - Sinistralis
1
就像我之前所说的那样,“通常情况下没问题,但每次使用都需要考虑一下”。毫无保留地推荐它是很危险的。 - Amadan
考虑到这是 JavaScript,这是一个公平的观点! - Sinistralis

1
你可以检查参数是否已定义,并将其硬编码到函数中。
例如:
 var preDefined = function(param) { 
    if(param === undefined) { 
        param = preDefinedValue
     }
     /* Rest of code goes here */
 }

预计时间:

ES6允许设置默认参数值(在我发布答案时不知道这一点)。

链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接