JavaScript 中的 Spread vs Rest 运算符

发布: (2026年4月4日 GMT+8 17:20)
4 分钟阅读
原文: Dev.to

Source: Dev.to

Cover image for Spread vs Rest Operators in JavaScript

最近,我写了很多后端代码,却一直对何时使用 展开运算符(spread operator)和何时使用 剩余运算符(rest operator)感到困惑。许多开发者也遇到同样的问题,所以在本文中,我将拆解它们的区别,展示常见的使用场景,并指出需要避免的典型错误。

需要讨论的主题

  • rest 运算符的作用
  • spread 运算符的作用
  • spread 与 rest 的区别
  • 何时使用每个运算符

剩余运算符

剩余运算符用于收集未显式列出的其余值。它常用于解构赋值和函数参数中。

示例(对象解构)

const user = {
  id: 1,
  name: "Kunal",
  email: "kunal@gmail.com",
  role: "admin",
  password: "secret"
};

// REST → extract password, collect the rest
const { password, ...safeUser } = user;

console.log(safeUser);

输出

// Password is extracted
{ id: 1, name: "Kunal", email: "kunal@gmail.com", role: "admin" }

剩余运算符出现在赋值的左侧,将其余属性收集到一个新对象(或在数组中使用时收集到新数组)中。

函数参数中的剩余运算符

function sum(first, ...rest) {
  return rest.reduce((total, n) => total + n, first);
}

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

这里 ...rest 会把第一个参数之后的所有实参收集到一个数组中。

扩展运算符

扩展运算符会将可迭代对象(数组或对象)的元素“展开”(或“扩散”)到新的上下文中。它常用于复制或合并数据结构。

示例(对象合并)

const user = {
  id: 1,
  name: "Kunal",
  email: "kunal@gmail.com",
  role: "admin",
  password: "secret"
};

// SPREAD → 合并 / 更新对象
const updatedUser = {
  ...user,
  role: "user"
};

console.log(updatedUser);

输出

{
  id: 1,
  name: "Kunal",
  email: "kunal@gmail.com",
  role: "user",
  password: "secret"
}

扩展运算符放在赋值的右侧,展开已有数据,从而可以添加或覆盖属性。

与数组一起使用

const numbers = [1, 2, 3];
const moreNumbers = [...numbers, 4, 5];
console.log(moreNumbers); // [1, 2, 3, 4, 5]

Differences Between Spread and Rest

FeatureSpread OperatorRest Operator
Purpose展开值收集剩余值
Use position右侧(例如在字面量、函数调用中)左侧(例如在解构、函数参数中)
Output单个值(或浅拷贝)包含收集值的数组或对象
Typical use case复制、合并或传递值将剩余值收集到单一变量
Behavior“打开”数据“打包”数据

何时使用每个运算符

  • Rest Operator – 当你需要将剩余项收集到数组或对象中时使用,例如:

    • 函数参数列表 (function fn(a, b, ...rest) {})
    • 解构赋值 (const { a, ...rest } = obj)
  • Spread Operator – 当你想要复制或合并数据结构时使用,例如:

    • 创建数组/对象的浅拷贝 (const copy = [...original])
    • 合并多个数组或对象 (const merged = { ...obj1, ...obj2 })
    • 在函数调用中展开元素 (myFunc(...args))

感谢阅读! 如果你喜欢这篇文章,欢迎探索更多相关主题的文章。

0 浏览
Back to Blog

相关文章

阅读更多 »

JavaScript 中的解构赋值

你有没有写过这样的代码?js // 重复提取 const numbers = 10, 20, 30; const first = numbers0; const second = numbers1; 它能工作——但它是……

同步 vs 异步 JavaScript

JavaScript 是单线程的,但它可以通过同步和异步行为高效地处理多个任务。什么是同步代码?同步…

理解 JavaScript 中的函数

什么是函数?函数是一段旨在执行特定任务的代码块。与其一次又一次地编写相同的代码,你可以只在内部编写一次。