JavaScript之转换函数所需语法:rest语法、参数语法和spread语法

138 阅读3分钟

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 语法用于将数组传递给通常需要含有许多参数的函数。