function myfunc( value1, value2='defaultValue' ) {
//some stuff
}
如果参数传入或不传入函数,我怎么知道呢?我知道如果你不传递任何东西作为参数,将设置默认值。我实际上想要检查用户是否作为第二个参数传递任何东西(即使它与默认值相同)并且更改我的回报值相应。
我正在查看ES6 docs和this SO answer ,而不是我正在寻找的内容。
谢谢,
答案 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
是完全不可伪造的。