Skip to main content

Command Palette

Search for a command to run...

Spread vs Rest Operators in JavaScript

Updated
6 min readView as Markdown

JavaScript introduced the ... syntax as part of modern ES6 features, and it quickly became one of the most commonly used operators in development. Interestingly, the same syntax is used for two completely different purposes:

  • Spread Operator → Expands values

  • Rest Operator → Collects values

Even though both use ..., their behavior depends entirely on where and how they are used.

Understanding these operators properly helps developers write cleaner, shorter, and more maintainable code.


Understanding the ... Syntax

The ... syntax can behave in two ways:

Operator Purpose
Spread Expands values
Rest Collects values

Think of it like this:

  • Spread opens a box and spreads items out.

  • Rest gathers multiple items into a box.


What is the Spread Operator?

The spread operator expands elements from arrays, objects, or iterable values into individual items.

Basic Array Example

const numbers = [1, 2, 3];

console.log(...numbers);

Output:

1 2 3

Instead of printing the entire array as one object, spread expands every value separately.


Using Spread with Arrays

One of the biggest use cases of spread is array manipulation.

Copying Arrays

const original = [1, 2, 3];

const copy = [...original];

console.log(copy);

Output:

[1, 2, 3]

This creates a new array instead of referencing the old one.


Merging Arrays

const fruits = ["apple", "banana"];
const vegetables = ["carrot", "potato"];

const food = [...fruits, ...vegetables];

console.log(food);

Output:

["apple", "banana", "carrot", "potato"]

This is cleaner than older methods like concat().


Adding New Elements

const numbers = [2, 3, 4];

const updated = [1, ...numbers, 5];

console.log(updated);

Output:

[1, 2, 3, 4, 5]

Spread makes immutable updates much easier, especially in React applications.


Using Spread with Objects

Spread also works with objects.

Copying Objects

const user = {
  name: "Aslam",
  age: 23
};

const copiedUser = { ...user };

console.log(copiedUser);

Merging Objects

const user = {
  name: "Aslam"
};

const details = {
  age: 23,
  city: "Bangalore"
};

const profile = {
  ...user,
  ...details
};

console.log(profile);

Output:

{
  name: "Aslam",
  age: 23,
  city: "Bangalore"
}

Overriding Properties

const user = {
  name: "Aslam",
  age: 20
};

const updatedUser = {
  ...user,
  age: 23
};

console.log(updatedUser);

Output:

{
  name: "Aslam",
  age: 23
}

Properties added later override earlier ones.


What is the Rest Operator?

The rest operator collects multiple values into a single structure.

It is commonly used in:

  • Function parameters

  • Array destructuring

  • Object destructuring


Rest Operator in Functions

Before rest parameters, JavaScript developers used the arguments object, which was harder to work with.

Rest parameters solve that problem cleanly.

Example

function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

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

Output:

10

Here:

...numbers

collects all arguments into an array.


Rest with Array Destructuring

const numbers = [1, 2, 3, 4, 5];

const [first, ...remaining] = numbers;

console.log(first);
console.log(remaining);

Output:

1
[2, 3, 4, 5]

The rest operator gathers leftover values.


Rest with Object Destructuring

const user = {
  name: "Aslam",
  age: 23,
  city: "Bangalore"
};

const { name, ...otherDetails } = user;

console.log(name);
console.log(otherDetails);

Output:

Aslam

{
  age: 23,
  city: "Bangalore"
}

Spread vs Rest: Main Difference

Although the syntax looks identical, the purpose is opposite.

Feature Spread Rest
Purpose Expands values Collects values
Direction One → Many Many → One
Common Usage Arrays, Objects, Function Calls Function Parameters, Destructuring
Behavior Breaks apart Packs together

Visual Understanding

Spread

const arr = [1, 2, 3];

console.log(...arr);

Think of it as:

1, 2, 3

Rest

function demo(...items) {
  console.log(items);
}

Think of it as:

[all values packed into one array]

Real-World Use Cases

1. Updating State in React

Spread is heavily used in React because state updates should remain immutable.

const updatedUser = {
  ...user,
  age: 24
};

2. Combining API Data

const allUsers = [...activeUsers, ...newUsers];

Useful when merging server responses.


3. Flexible Functions

function logMessages(...messages) {
  messages.forEach(msg => console.log(msg));
}

This allows functions to accept unlimited arguments.


4. Removing Properties from Objects

const user = {
  id: 1,
  name: "Aslam",
  password: "12345"
};

const { password, ...safeUser } = user;

console.log(safeUser);

Useful before sending data to the frontend or API response.


Common Mistakes

Confusing Spread and Rest

Spread

const arr = [1, 2];

console.log(...arr);

Expands values.


Rest

function test(...args) {
  console.log(args);
}

Collects values.


Forgetting That Spread Creates Shallow Copies

const original = [{ name: "Aslam" }];

const copy = [...original];

copy[0].name = "Ali";

console.log(original);

Output:

[{ name: "Ali" }]

Nested objects are still shared.


Why These Operators Matter

Spread and rest operators solve several problems:

  • Reduce boilerplate code

  • Improve readability

  • Simplify immutable updates

  • Make functions more flexible

  • Improve array and object handling

Modern JavaScript development heavily depends on them, especially in:

  • React

  • Node.js

  • API handling

  • State management

  • Functional programming patterns


Final Thoughts

The spread and rest operators may look identical, but their behavior is completely different.

  • Spread expands values outward.

  • Rest gathers values inward.

1 views