argument是ES5获取参数方式,rest是ES6获取参数方式,用来代替arguments
argument:是一个类数组对象,包含调用函数时传入的所有参数。这个对象在箭头函数里时用不了的,只有以function关键字定义的函数才会有。arguments 对象其实还有一个 callee 属性,是一个指向 arguments 对象所在函数的指针。
在严格模式下访问arguments.callee会报错;es5也定义了arguments.caller,但在严格模式下访问它会报错,在非严格模式下则始终是undefined。这是为了区分arguments.caller和caller
比如
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}
/*
阶乘函数一般定义成递归调用的,就像上面这个例子一样。只要给函数一个名称,而且这个名称不
会变,这样定义就没有问题。但是,这个函数要正确执行就必须保证函数名是 factorial,从而导致
了紧密耦合。使用 arguments.callee 就可以让函数逻辑与函数名解耦:*/
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
例子1,argument方式
例子2,rest方式(注意看结果是数组)
需要注意的是,rest参数必须要放到参数最后
扩展
rest参数的 ... 跟扩展运算符的符号是一样的,用法不同,如下
rest的...在函数声明的形参位置,扩展运算符在调用的实参里