JavaScript 中的 Rest 与 Spread 语法

300 阅读2分钟

前言

但在本文中,我将讨论剩余运算符 ( ... ),它看起来与展开运算符相似,但用途不同。我们将看到这两个运算符有何不同。

展开运算符

展开运算符 ( ... ) 用于传播对象的属性。例如,您可以这样做。

const obj = {
    a: 1,
    b: 2,
    c: 3
};  

const newObj = {
    ...obj
};

console.log(newObj);
// { a: 1, b: 2, c: 3 } 

newObj 对象具有 obj 对象的所有属性。这是因为展开运算符 ( ... ) 用于展开 obj 对象的属性。

顾名思义,展开运算符将一个对象的属性“展开”到另一个对象。

它的另一个用例是在调用函数时扩展函数参数。例如,

const arr = [1, 2, 3];

const sum = (a, b, c) => a + b + c;

console.log(sum(...arr)); // Outputs: 6
//                 ^
//          sum(1, 2, 3)  

展开运算符 ( ... ) 用于将数组元素展开到函数参数。因此, sum() 函数将接收数组元素作为函数参数。

剩余运算符

另一方面,

剩余运算符 ( ... ) 用于将函数参数收集到数组中。因此,它与展开运算符相反。

例如,

const sum = (...args) => {
    return args.reduce((acc, curr) => acc + curr, 0);
    //      ^
    //  [1, 2, 3]
};

console.log(sum(1, 2, 3));
// 6 

剩余运算符 ( ... ) 用于将函数参数收集到一个数组中。因此, sum() 函数将以数组形式接收函数参数。

您还可以使用 rest 运算符来收集函数的剩余参数。例如

const sum = (a, b, ...restOfArguments) => {
    return a + b + restOfArguments.reduce((acc, curr) => acc + curr, 0);
    //     ^   ^          ^
    //     1   2      [3, 4, 5]
};

console.log(sum(1, 2, 3, 4, 5));
// 15 

剩余运算符 ( ... ) 用于将 sum() 函数的剩余参数收集到一个数组中。因此, sum() 函数将接收剩余的参数作为一个数组 ( restOfArguments ),您可以使用它来循环。

Caveats

rest 运算符有一些注意事项。您只能将它用作函数的最后一个参数。例如

const sum = (a, b, ...restOfArguments, c) => {
    return a + b + restOfArguments.reduce((acc, curr) => acc + curr, 0) + c;
};

console.log(sum(1, 2, 3, 4, 5, 6));
// SyntaxError: Rest 参数必须是最后一个

此外, 不能在一个函数中使用多个剩余运算符。例如,

const sum = (a, b, ...restOfArguments, ...restOfArguments2) => {
    return a + b + restOfArguments.reduce((acc, curr) => acc + curr, 0) + restOfArguments2.reduce((acc, curr) => acc + curr, 0);
};

console.log(sum(1, 2, 3, 4, 5, 6, 7, 8, 9)); 

 结论

在本文中,我们看到了展开运算符 ( ... ) 和剩余运算符 ( ... ) 在视觉上的区别。我们还看到了如何在 JavaScript 中使用它们。

全文完

谢谢!

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天

点击查看活动详情