【问题标题】:JavaScript function - named parameters issue when skipping an optional parameterJavaScript 函数 - 跳过可选参数时的命名参数问题
【发布时间】:2019-11-11 14:30:13
【问题描述】:

如果您在浏览器的控制台中运行以下代码:

function named_param(a, b=null, c=5) {
  console.log("a="+a);
  console.log("b="+b);
  console.log("c="+c);
}

named_param(3, c=10)

收到的输出是:

a=3
b=10
c=5

我正在寻找的输出是:

a=3
b=null
c=10

我看到了以下两个网址并尝试了一些解决方法,但都没有成功

Javascript Function Parameters Not Working

Named parameters in javascript

让我知道我在这里做错的步骤。尝试了以下代码,但没有奏效: 答:

function named_param(a, {b=null, c=5}) {
  console.log("a="+a);
  console.log("b="+b);
  console.log("c="+c);
}

named_param(3, c=10)

乙:

function named_param(a, {b=null, c=5}={}) {
  console.log("a="+a);
  console.log("b="+b);
  console.log("c="+c);
}

named_param(3, c=10)

【问题讨论】:

  • JavaScript 没有命名参数。请尝试在严格模式下运行named_param(3, c=10),你会得到一个异常。
  • Javascript Function Parameters Not Working”问题与此无关。

标签: javascript named-parameters


【解决方案1】:

使用解构解决方案时,您必须传递一个实际对象。 named_param(3, c=10) 只是无效的语法(好吧,它是有效的,但它是对作为第二个参数传递的全局 c 变量的赋值 - 没有命名)。

function named_param(a, {b=null, c=5}={}) {
  console.log("a="+a);
  console.log("b="+b);
  console.log("c="+c);
}

named_param(3)
named_param(3, {b:"hi"})
named_param(3, {c:10})
named_param(3, {b:"hi", c:10})

【讨论】:

    【解决方案2】:

    中间可以跳过参数,所以当你传递时

    named_param(3, c=10)
                |   |_____________ considered as `b`
                |_________________ considered as `a`
    

    你可以使用对象和解构

    function named({a,b=null,c=3} = {}){
      console.log('a-->',a)
      console.log('b-->',b)
      console.log('c-->',c)
    }
    
    named({a:1,c:2})
    named()
    named({c:2})

    【讨论】:

      【解决方案3】:

      您可以做的是使用解构对象,例如:

      function named_params({a = 4, b = null, c = 5} = {a:1, b: 2, c:3}) { console.log(a,b,c) }
      

      那么,对您的函数的调用将是:

      named_params({a: 3, c:10})
      

      【讨论】:

      • name_params()name_params({}) 有不同的默认值很奇怪
      【解决方案4】:

      好吧,这不是问题,只是您尝试在根本不支持的情况下使用命名参数。

      要达到您的需要,您应该这样做:

      function named_param({a, b, c}) {
        console.log("a="+a);
        console.log("b="+b);
        console.log("c="+c);
      }
      
      named_param({a:5, c:9}); 
      // Output:
      // a=5
      // b=undefined
      // c=9
      

      一开始我误解了你的问题,建议对arguments对象使用解构赋值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多