面试算法-02

131 阅读2分钟

写一个加法函数(sum),使他可以同时支持sum(x,y)和sum(x)(y)两种调用方式

考察无命名参数arguments/不定参数(...)的运用

arguments:arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引 0 处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:

arguments[0];
arguments[1];
arguments[2];
function func1(a) {
  console.log(arguments[0]);
  // Expected output: 1

  console.log(arguments[1]);
  // Expected output: 2

  console.log(arguments[2]);
  // Expected output: 3
}

func1(1, 2, 3);

不定参数:将一个不定数量的参数表示为一个数组。 如果函数的最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。

剩余参数和 arguments对象的区别

剩余参数和 arguments对象之间的区别主要有三个:

  • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
  • arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sortmapforEachpop
  • arguments对象还有一些附加的属性(如callee属性)。
function sum(...theArgs) {
  let total = 0;
  for (const arg of theArgs) {
    total += arg;
  }
  return total;
}

console.log(sum(1, 2, 3));
// Expected output: 6

console.log(sum(1, 2, 3, 4));
// Expected output: 10

再回到这道题本身,就会变得很简单了 es6写法

const sum = (...args) => {
  if (args.length === 0) {
    return 0;
  }
  if (args.length === 2) {
    return args[0] + args[1];
  }
  if (args.length === 1) {
    return (b) => {
      return args[0] + b;
    };
  }
};

es5写法

function sum() {
  if (arguments.length === 0) {
    return 0;
  }
  if (arguments.length === 2) {
    return arguments[0] + arguments[1];
  }
  if (arguments.length === 1) {
    return (b) => {
      return arguments[0] + b;
    };
  }
}