ES6 with default arguments : 参数是否传入

ES6 with default arguments : Whether a parameter is passed in or not

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

我怎么知道参数是否传入函数。我知道如果您不传入任何内容,将设置默认值,因为 argument.I 实际上想检查用户是否将任何内容作为第二个参数传递(即使它与默认值相同)并更改我的 return 相应的值。

我正在检查 ES6 docs and this SO answer ,不是我要找的东西。

谢谢,

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 posted .

对于复杂的参数处理,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);
  ...
}

您可以使用不可伪造的令牌作为默认参数值。没有调用者能够将这个值作为参数传递,所以'defaultValue'你知道参数最终绑定到这个特定值的唯一方法是没有参数通过了

谢天谢地,ECMAScript 有一个不可伪造令牌的数据类型完全我们想要的:Symbol:

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

这当然有点难看,但我认为它比弄乱 arguments 更难看,而且它是 确切地 是否确定的可靠方法是否传递了可选参数,因为 Symbols 是完全不可伪造的。