1.参数语法
argument是一个绑定到函数的特殊可迭代值,是一个类数组,在函数体内,可以通过argument对象来访问这个参数数组,从而获取传递给函数的每一个参数
注:箭头函数没有argument
function sum(){
let sum = 0;
for(const num of argument){
sun += num;
}
return sum;
}
sum(1,2,3);//返回值为6
argument对象只是与数组类似(并不是array的实例),因为可以使用方括号语法访问它的每一个元素(argument[0]、argument[1]...),使用length属性来确定传递进来多少个参数。
注意:argument对象始终包含所有参数,不能像rest参数可以只获取一部分参数
2.rest语法
在javaScript中,可以使用rest语法将所有传递的参数作为数组访问,然后使用spread语法传递回函数
function sum(...nums){
let sum = 0;
for(const num of nums){
sum += num;
}
return sum;
}
sum(1,2,3)//返回值为6
在JavaScript中,rest语法可以转换任意函数
3.spread语法
上面的语法都属于从参数列表中获取数组,但我们也需要返回参数等操作。
eg: 内建函数Math.max返回参数中最大的值
alert(Math.max(1,2,3))//3
但如果直接使用Math.max调用一个数组[1,2,3],是不可以的,因为Math.max需要列表形式的数值型参数,并不是一个数组:
let arr = [1,2,3];
alert(Math.max(arr));//NaN,不行
所以我们可以使用spread语法:
let arr = [1,2,3];
alert(Math.max(...arr));
在函数中调用...arr,将可迭代对象arr展开到参数列表中,可以把数组转换为参数列表
还能传入多个可迭代对象:
let arr1 = [1,2,3];
let arr2 = [4,5,6];
alert(Math.max(...arr1,...arr2));//6
alert(Math.max(0,...arr1,...arr2,10,12));//12
使用spresd语法将字符串转换为字符数组:
let str = "spread";
alert([...str])//s,p,r,e,a,d
Spread 语法内部使用了迭代器来收集元素,与 for..of 的方式相同。因此,对于一个字符串,for..of 会逐个返回该字符串中的字符,...str 也同理会得到 "H","e","l","l","o" 这样的结果。随后,字符列表被传递给数组初始化器 [...str]。
对于这个特定任务,我们还可以使用 Array.from 来实现,因为该方法会将一个可迭代对象(如字符串)转换为数组:
let str = "spread";
alert(Array.from)//s,p,r,e,a,d
小小地总结一下
由于rest参数和spread参数都是"..."的形式,需要区分它们是 rest 参数,还是是 spread 语法。
- 如果
...是在函数参数列表的最后,那么它就是 rest 参数,它会把参数列表中剩余的参数收集到一个数组中。- 如果
...是在函数调用或类似的表达式中,那它就是 spread 语法,它会把一个数组展开为列表。最后:
Rest 参数用于创建可接受任意数量参数的函数。Spread 语法用于将数组传递给通常需要含有许多参数的函数。