Skip to main content

Command Palette

Search for a command to run...

Spread vs Rest Operator in JavaScript

Published
6 min read
Spread vs Rest Operator in JavaScript

Introduction

If you have worked with modern JavaScript, you have probably seen the triple-dot syntax:

...

At first, this syntax can feel confusing because the same symbol is used for two completely different behaviors. Mainly expands and collects values. This is the actual reason why most developers mess up in interviews.

The important thing to understand is:

  • Spread Operator → Expands values

  • Rest Operator → Collects values

Even though both use the same ... The syntax of their behavior depends entirely on where they are used.

Understanding the Idea with a Simple Analogy

Imagine there is a backup filled with all your items.

Spread Operator

You open the backpack and place every item separatly on the table. Here you are taking things out of the backpack.

Backpack → Notebook, Charger, Mouse

This is exactly what the spread operator does. It takes grouped values and expands them into individual items.

Rest Operator

Now imagine loose items scattered on a table.

You collect all of them and put them into one backpack. Here you are collecting scattered items and putting them again on backpack

Notebook + Charger + Mouse → Backpack

That is how the rest operator works. It gathers multiple values into a single collection.

What is the Spread Operator?

The spread operator expands values from:

  • Arrays

  • Objects

  • Strings

  • Iterables

Commonly used for coping, margin, cloning, and passing multiple arguments.

Spread Operator with Arrays

Suppose you are building a reading app and want to combine two book lists.

const sciFiBooks = ['Dune', 'Foundation'];
const fantasyBooks = ['Harry Potter', 'The Hobbit'];

const library = [...sciFiBooks, ...fantasyBooks, 'Atomic Habits'];

console.log(library);

Output

[
  'Dune',
  'Foundation',
  'Harry Potter',
  'The Hobbit',
  'Atomic Habits'
]

Copying Arrays with Spread

Without spread, copying arrays manually becomes repetitive.

const original = [10, 20, 30];

const copied = [...original];

console.log(copied);

Output

[10, 20, 30] 

Spread Operator with Objects

Spread is also extremely useful when working with objects.

const userProfile = {
  username: 'pallab',
  verified: false
};

const updatedProfile = {
  ...userProfile,
  verified: true
};

console.log(updatedProfile);

Output

{
  username: 'pallab',
  verified: true
}

Why Developers Use This

Instead of modifying the original object directly, spread creates a new object while copying existing properties.

This pattern is heavily used in:

  • React state management

  • Redux

  • Immutable data handling

Spread Operator in Function Calls

Spread can also unpack array elements while calling functions.

const dimensions = [1920, 1080];

function createCanvas(width, height) {
  console.log(`Canvas Size: \({width}x\){height}`);
}

createCanvas(...dimensions);

Output

Canvas Size: 1920x1080

Without spread:

createCanvas(dimensions);

The function would receive the entire array as a single argument.

Spread separates the values automatically.

What is the Rest Operator?

The rest operator collects multiple values and stores them inside a single variable.

It is mostly used in:

  • Function parameters

  • Array destructuring

  • Object destructuring

A simple way to remember it:

Spread → Unpack
Rest → Pack

Rest Operator in Function Parameters

Sometimes you do not know how many arguments a function will receive.

The rest operator helps handle this situation elegantly.

function calculateTotal(...prices) {

  let total = 0;

  for (const price of prices) {
    total += price;
  }

  console.log(`Total Amount: ${total}`);
}

calculateTotal(120, 80, 150, 50);

Output

Total Amount: 400

What Happened Here?

...prices

collected all incoming arguments into one array:

[120, 80, 150, 50]

That means:

  • prices becomes an array

  • You can use array methods on it

  • The function becomes flexible

Rest Operator in Array Destructuring

Rest is also useful while extracting values from arrays.

const serverLogs = [
  'Error 500',
  'Database Connected',
  'User Logged In',
  'Cache Cleared'
];

const [latestLog, ...olderLogs] = serverLogs;

console.log(latestLog);
console.log(olderLogs);

Output

Error 500

[
  'Database Connected',
  'User Logged In',
  'Cache Cleared'
]

Rest Operator with Objects

You can also separate properties from objects.

const laptop = {
  brand: 'HP',
  processor: 'Ryzen 7',
  ram: '16GB',
  gpu: 'RTX 3050'
};

const { brand, ...specifications } = laptop;

console.log(brand);
console.log(specifications);

Output

HP

{
  processor: 'Ryzen 7',
  ram: '16GB',
  gpu: 'RTX 3050'
}

Key Differences Between Spread and Rest

Feature Spread Operator Rest Operator
Purpose Expands values Collects values
Behavior Unpacks data Packs data
Common Usage Arrays, objects, function calls Function params, destructuring
Output Individual values Single array/object
Position Usually on the right side Usually on the left side
Mental Model Opening a box Filling a box

Real-World Example

Let’s combine both operators in one practical example.

const activeUser = {
  id: 101,
  name: 'Pallab'
};

const permissions = ['read', 'write', 'delete'];

function createSession(user, ...accessRights) {

  return {
    ...user,
    status: 'active',
    permissions: [...accessRights]
  };
}

const session = createSession(activeUser, ...permissions);

console.log(session);

Output

{
  id: 101,
  name: 'Pallab',
  status: 'active',
  permissions: ['read', 'write', 'delete']
}

Common Mistakes Developers Make

Mistake 1: Confusing Spread and Rest

function demo(...items) {}

This is Rest because it collects arguments.

const copied = [...array];

This is Spread because it expands values.

Mistake 2: Rest Must Be Last

This is invalid:

const [...remaining, last] = [1, 2, 3];

Rest elements must always appear at the end.

Correct version:

const [first, ...remaining] = [1, 2, 3];

When to Use Spread

Use spread when you want to:

  • Merge arrays

  • Copy arrays

  • Clone objects

  • Pass array items individually

  • Create immutable updates

When to Use Rest

Use rest when you want to:

  • Accept unlimited function arguments

  • Collect remaining values

  • Group leftover items

  • Simplify destructuring

Final Thoughts

The triple-dot syntax becomes much easier once you focus on its behavior instead of the symbol itself.

Remember This Rule

Spread → Expands values
Rest → Collects values