ES2015(或更高版本)

时间:2018-03-24 10:40:51

标签: javascript ecmascript-6

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

从其他语言模拟命名参数。

2 个答案:

答案 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