带有默认参数的ES6:是否传入参数

时间:2016-11-24 15:07:07

标签: javascript ecmascript-6 default-parameters

function myfunc( value1, value2='defaultValue' ) {
  //some stuff
}

如果参数传入或不传入函数,我怎么知道呢?我知道如果你不传递任何东西作为参数,将设置默认值。我实际上想要检查用户是否作为第二个参数传递任何东西(即使它与默认值相同)并且更改我的回报值相应。

我正在查看ES6 docsthis SO answer ,而不是我正在寻找的内容。

谢谢,

3 个答案:

答案 0 :(得分:10)

arguments仍代表您发送的实际参数,因此arguments.length会向您提供该信息。



function myfunc( value1, value2='defaultValue' ) {
  console.log("value1", value1);
  console.log("value2", value2);
  console.log("length", arguments.length);
}
myfunc("foo");




在兼容的JavaScript引擎上输出

value1 foo
value2 defaultValue
length 1

arguments无法在箭头功能中使用,并且estus发布了a good alternative that does

答案 1 :(得分:5)

对于复杂的参数处理,rest参数可能是有益的,也弃用arguments.length

function myfunc(...args) {
  let [value1, value2 = 'defaultValue'] = args;

  console.log("value1", value1);
  console.log("value2", value2);
  console.log("args.length", args.length);
}
myfunc("foo");

手动参数解析对于使用直观的默认方法的情况特别有用,即当传递的参数应该替换默认值时,即使它是undefined

function myfunc(...args) {
  const defaultArgs = ['defaultValue1', 'defaultValue2'];
  let [value1, value2] = Object.assign(defaultArgs, args);
  ...
}

答案 2 :(得分:0)

您可以使用不可伪造的令牌作为默认参数值。没有调用者将能够将该值作为参数传递,因此“ defaultValue”您知道,该参数最终可以绑定到该特定值的唯一方法是不传递任何参数。

非常感谢,ECMAScript具有一个不可伪造令牌的数据类型,它确实精确地实现了我们想要的功能:Symbol

const myfunc = (() => {
    const value2Token = Symbol("value2");
    return function myfunc(value1, value2 = value2Token) {
        if (value2 === value2Token) { value2 = 'defaultValue'; }
        // some stuff
    }
})();

这当然有点丑陋,但是我认为它不像弄乱arguments那样丑陋,这是一种确切地了解 是否传递了可选参数的可靠方法是否可以,因为Symbol是完全不可伪造的。