ES6 - 拓展运算符与rest参数

75 阅读2分钟

扩展运算符

把数组或者类数组展开成逗号隔开的值

例 1: 如何将函数的参数同数组arr中的值对应匹配?

// 结构赋值需要等号2边的形式要一样,a,b,c不是数组的形式[a,b,c]
function foo(a,b,c){
console.log(a,b,c);
}

let arr = [1,2,3]

// ...arr = 1,2,3
foo(...arr)                                //  1 2 3     

例 2:数组的合并

ES5实现

let arr1 = [1,2,3]
let arr2 = [4,5,6]
Array.prototype.push.apply(arr1,arr2)
console.log(arr1);                     //  [1, 2, 3, 4, 5, 6]

ES6实现

通过扩展运算符把数组打散再push到数组中

let arr1 = [1,2,3]
let arr2 = [4,5,6]
arr1.push(...arr2)
console.log(arr1);                    //  [1, 2, 3, 4, 5, 6]

例 3: 将字符串转成数组

let str = 'EcmaScript'
let arr = [...str]
console.log(arr);                  // ['E', 'c', 'm', 'a', 'S', 'c', 'r', 'i', 'p', 't']

rest参数

剩余运算符

把逗号隔开的值组合成一个数组

// 传入不定个数的实参
function foo(...args){
    console.log(args);
}
console.log(foo(1,2));        // [1,2]
console.log(foo(1,2,3));      // [1,2,3]

例1: 传入的实参可能是不确定的,判断不定参数的和

ES5中实现

function foo(x,y,z){
    let sum = 0
    Array.prototype.forEach.call(arguments,function(item){
        sum += item
    })
    return sum
}
console.log(foo(1,2));              // 3
console.log(foo(1,2,3));            // 6

ES6中实现

使用Array.from()将伪数组转成真的数组,再遍历

function foo(x,y,z){
    let sum = 0
    Array.from(arguments).forEach(function(item){
        sum += item
    })
    return sum
}
console.log(foo(1,2));           // 3
console.log(foo(1,2,3));         // 6

rest参数实现

function foo(...args){
let sum = 0
args.forEach(function(item){
    sum += item
})
return sum
}
console.log(foo(1,2));
console.log(foo(1,2,3));

例2:获取剩余的不确定的参数

在写函数形参的时候,不知道调用函数者会传几个实参时,可以用剩余运算符取到不确定的参数

// 只确定x,剩余的参数不确定
function foo(x,...args){
    console.log(x);
    console.log(args);
}
console.log(foo(1,2,3));        // 1 [2,3]
console.log(foo(1,2,3,4));      // 1 [2,3,4]

例3: 剩余参数和解构结合

let [x,...y] = [1,2,3]
console.log(x);             // 1
console.log(y);             // [2,3]

总结

  • 如果...放在等号的左边或者放在形参上那么它就是rest剩余参数
  • 如果...放在等号的右边或者放在实参上那么它就是扩展运算符