ES2015介绍了default parameters。在其他具有默认参数的语言中,它们通常也可以在函数调用中命名,以便在有多个语言时更有用:
function foo(baz = 0, bar = 1) { ... }
foo(bar = 3); // baz should be 0
ES2015似乎没有添加这个(如果我错过了它或者以后版本的话,我会很乐意学习)。
有一种传递对象的旧方法:
function foo(options) {
baz = options.baz || 0;
bar = options.bar || 1;
}
foo({bar: 3}); // baz is 0
我正在寻找的是一种结合它们的方法,所以我可以打电话给
foo(5) // baz = 5, bar = 1
foo({baz: 5}) // baz = 5, bar = 1
foo({bar: 3}); // baz = 0, bar = 3
foo(5, {bar: 3}); // baz = 5, bar = 3
从其他语言模拟命名参数。
答案 0 :(得分:3)
通过在输入参数上使用对象解构来实现部分:
// The object being passed is also optional.
// - If you call the function with no parameter,
// it'll be set an empty object so you'll get the default one
// - If you give an object with any of the properties already set
// you either get these values or one of the defaults
const f = ( { x = 11, y = 10 } = {} ) => {
console.log( `${x} ${y}` )
}
f( { y: 20 } )

顺便说一句,你可以将常规参数与结构化参数结合起来,但你不能提供可破坏的参数,就像它们是常规参数一样:
f( 1, { y: 10 } )
无法分配x
。f( { x: 10 }, 2 )
无法分配y
。此外,您可以接受常规和结构化参数:
const f = ( w, { x = 1, y = 2 } = {}, z = 3 ) =>
console.log( `${w} ${x} ${y} ${z}` )
f( 80, { y: 35 } )

您被迫提供参数地图(即对象)。顺便说一句,如果你习惯了这种方法,你几乎可以获得相同的功能,除了能够提供未命名的位置参数。
答案 1 :(得分:1)
可以在这种情况下工作,但可能不值得。使用MatíasFidemraizer的方法。
const foo = (arg1, arg2) =>
{
let args = { baz: 0 , bar: 1 };
if (typeof arg1 == 'number')
args.baz = arg1;
else
Object.assign(args, arg1);
if (typeof arg2 == 'number')
args.bar = arg2;
else
Object.assign(args, arg2);
console.log(args);
}
foo(5) // baz = 5, bar = 1
foo({baz: 5}) // baz = 5, bar = 1
foo({bar: 3}); // baz = 0, bar = 3
foo(5, {bar: 3}); // baz = 5, bar = 3