【问题标题】:JavaScript function with optional parameters [duplicate]带有可选参数的 JavaScript 函数 [重复]
【发布时间】:2016-03-27 02:41:17
【问题描述】:

我是来自 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 实现吗?

【问题讨论】:

  • google 搜索“JavaScript 可选参数”或“JavaScript 命名参数”。
  • 不是直接的。您可以检查是否定义了参数并将其硬编码到您的函数中。例如var preDefined = function(param) { if(param === undefined) { param =predefinedValue } /* 其余代码放在这里 */ }
  • @Mike,听说过 ES6 吗?
  • @jfriend00 不确定这是一个精确的重复,无论如何它不处理命名参数的问题。
  • @torazaburo - 我在引用的 dup 答案中添加了有关命名参数和 ES6 默认参数值的信息。

标签: javascript named-parameters default-parameters


【解决方案1】:

这样做的一个好方法是对所有参数使用一个对象。比如:

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 个 args,通常最好让它接受一个对象。 +1
  • 这是迄今为止“最好”的选项,也是我现在经常使用的选项。
【解决方案2】:

一种方法是检查参数值是否为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"; 的经典模式。
  • @torazaburo:这种模式在 Ruby 中几乎总是可以的,但在 JavaScript 中,您需要注意变量的潜在值,以防该值在其域中合法地具有虚假值之一。通常没问题,但每次都需要考虑; if (typeof(chart_type) == "undefined") chart_type = "1" 是安全的变体。
  • @torazaburo 我不喜欢这种模式,因为在某些情况下,您可能希望实际传递一个 falsey0。我想这个问题很好,但我不想让事情复杂化。
  • 当您希望第一个参数具有默认值时,就会出现问题。如果你给data 一个默认值呢?您将无法使用它,因为如果您省略 data 参数并且您的第一个参数用于 xlabel,那么您实际上将 data 设置为您在 xlabel 中所需的值。跨度>
  • @Moogs 是的,我并不是在所有情况下都建议这样做,显然不是在可以传入虚假值的情况下,但对于例如参数被省略的情况,这是一个常见的习惯用法或者一个物体,这就是为什么我说它值得一提。
【解决方案3】:

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

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

【讨论】:

  • 查看Moogs's answer 下的 cmets 了解为什么这不是很好。
  • 取决于您期望的参数,但这肯定是一个有效的观点。我很少处理可以为 0 的值,所以这是我常用的模式。无论哪种方式,当然可以提出不遵循例外模式的案例。
  • 正如我在那里所说的,“通常没问题,但你需要每次都考虑一下”。不加说明地推荐它是危险的。
  • 考虑到这是 javascript,这是一个公平的观点!
【解决方案4】:

您可以检查是否定义了参数并将其硬编码到您的函数中。

例如

 var preDefined = function(param) { 
    if(param === undefined) { 
        param = preDefinedValue
     }
     /* Rest of code goes here */
 }

预计到达时间:

ES6 允许默认参数值(我发布答案时没有意识到这一点)。

Link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 2021-01-27
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多