Javascript:如何编写接受不同数量参数的函数

Javascript:如何编写接受不同数量参数的函数,javascript,reactjs,flowtype,Javascript,Reactjs,Flowtype,在JS(使用流)中,如何定义函数并使用不同数量的参数调用它 假设我有一个用flow输入参数的函数 function fun( name: string, age?: string, gender: string, metaData?: { hobby: ?string, lifeGoal: ?string, } ): void { // do something } 我想用两种方式来称呼他们: fun('Jimmy', '30', 'male', {ho

在JS(使用流)中,如何定义函数并使用不同数量的参数调用它

假设我有一个用flow输入参数的函数

function fun(
  name: string,
  age?: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
  // do something
}
我想用两种方式来称呼他们:

fun('Jimmy', '30', 'male', {hobby: 'ride bike', lifeGoal: 'beat Zerg'});
如果我不想将“年龄”放入“元数据”中,我如何确保将“女性”映射到“性别”而不是“年龄”,因为它们都是字符串类型。

这称为“重载”,不是javascript的一项功能。你可以通过允许你的函数接受一个对象作为参数来伪造它,你可以在这个对象中填充你想要的任何东西。例如,见下文:

function foo(a, b, opts) {
  // ...
  if (opts['test']) { } //if test param exists, do something.. 
}


foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});`

Javascript不支持像Python那样的命名参数

如果您可以依赖于传输,则可以这样做(并注意以下事项):

否则,您可以对不打算传递的值传递
未定义的

fun('Kerri', undefined, 'female' ...

或者在并非所有属性都存在的情况下使用大型对象。但是你说你不需要它。

正如前面的海报所提到的,JS中没有重载。但是,您可以创建另一个函数来封装原始函数,并始终将null传递给age

新功能 原函数
您应该传递单个对象:

    function fun(value : {
      name: string,
      age?: string,
      gender: string,
      metaData?: {
        hobby: ?string,
        lifeGoal: ?string,
      }
    }): void {
      // do something
    }
因此,将所有参数转换为单个对象

那么你的例子就更好了:

fun({name: 'Jimmy', age: '30', gender:'male', metadata: {hobby: 'ride bike', lifeGoal: 'beat Zerg'}});

fun({name: 'Kerri', gender:'female', metadata:{hobby: 'transform', lifeGoal: 'beat Terran'}});

流对象类型:

当不应设置年龄时,使用null作为第二个参数如何?
function noAgefun(
  name: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
   fun(name, null, gender, metaData);
}
function fun(
  name: string,
  age?: string,
  gender: string,
  metaData?: {
    hobby: ?string,
    lifeGoal: ?string,
  }
): void {
  // do something
}
    function fun(value : {
      name: string,
      age?: string,
      gender: string,
      metaData?: {
        hobby: ?string,
        lifeGoal: ?string,
      }
    }): void {
      // do something
    }
fun({name: 'Jimmy', age: '30', gender:'male', metadata: {hobby: 'ride bike', lifeGoal: 'beat Zerg'}});

fun({name: 'Kerri', gender:'female', metadata:{hobby: 'transform', lifeGoal: 'beat Terran'}});