写一个加法函数(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实例,也就是说你能够在它上面直接使用所有的数组方法,比如sort,map,forEach或pop。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;
};
}
}