协慌网

登录 贡献 社区

Javascript 中的函数重载 - 最佳做法

在 JavaScript 中伪造函数重载的最佳方法是什么?

我知道不可能像其他语言一样重载 Javascript 中的函数。如果我需要两个函数一起使用foo(x)foo(x,y,z) ,这是最佳 / 首选方式:

  1. 首先使用不同的名称
  2. 使用可选参数,例如y = y || 'default'
  3. 使用参数数量
  4. 检查参数类型
  5. 或如何?

答案

使用参数进行函数重载的最佳方法是不检查参数长度或类型;检查类型只会使您的代码变慢,并且可以享受数组,空值,对象等的乐趣。

大多数开发人员所做的就是将对象作为方法的最后一个参数。该对象可以容纳任何东西。

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"});

然后,您可以在方法中以任何方式处理它。 [切换,if-else 等。]

我经常这样做:

C#:

public string CatStrings(string p1)                  {return p1;}
public string CatStrings(string p1, int p2)          {return p1+p2.ToString();}
public string CatStrings(string p1, int p2, bool p3) {return p1+p2.ToString()+p3.ToString();}

CatStrings("one");        // result = one
CatStrings("one",2);      // result = one2
CatStrings("one",2,true); // result = one2true

等效的 JavaScript:

function CatStrings(p1, p2, p3)
{
  var s = p1;
  if(typeof p2 !== "undefined") {s += p2;}
  if(typeof p3 !== "undefined") {s += p3;}
  return s;
};

CatStrings("one");        // result = one
CatStrings("one",2);      // result = one2
CatStrings("one",2,true); // result = one2true

实际上,这个特定示例比 C#在 javascript 中更优雅。未指定的参数在 javascript 中为 “未定义”,在 if 语句中计算为 false。但是,函数定义未传达 p2 和 p3 是可选的信息。如果您需要大量重载,则 jQuery 决定使用一个对象作为参数,例如 jQuery.ajax(options)。我同意他们的观点,这是最重载的功能最强大且清晰可记录的方法,但是我很少需要一个或两个以上的快速可选参数。

编辑:根据 Ian 的建议更改了 IF 测试

JavaScript 中没有实际的函数重载,因为它允许传递任意数量的任何类型的参数。您必须在函数内部检查已传递了多少个参数以及它们是什么类型。