Skip to main content

Command Palette

Search for a command to run...

Spread vs Rest Operators in JavaScript

Published
5 min read
Spread vs Rest Operators in JavaScript

At first glance, the spread operator and rest operator look exactly the same. Both use three dots:

...

That is why a lot of beginners get confused.

But even though they share the same syntax, they do two very different jobs.

A simple way to remember them is this:

  • Spread expands values

  • Rest collects values

Once that idea clicks, the difference becomes much easier to understand.


Why This Confuses So Many People

The confusion happens because JavaScript uses the same ... symbol in different places.

For example:

const nums = [1, 2, 3];
console.log(...nums);

and

function add(...nums) {
  console.log(nums);
}

The syntax looks identical, but the behavior is different.

In the first case, ...nums is spreading the array into individual values. In the second case, ...nums is collecting multiple values into one array.

So the real difference is not the symbol. The difference is how it is being used.


What the Spread Operator Does

The spread operator takes an existing array or object and expands it into individual values.

Think of it like opening a box and spilling everything out.

Spread with Arrays

const numbers = [1, 2, 3];

console.log(...numbers);

Output:

1 2 3

Instead of treating numbers as one array, JavaScript expands it into separate values.


Copying an Array

A very common use case is creating a copy of an array.

const fruits = ["apple", "banana", "mango"];
const newFruits = [...fruits];

console.log(newFruits);

Output:

["apple", "banana", "mango"]

This is cleaner than manually looping through the array to copy it.


Merging Arrays

const even = [2, 4, 6];
const odd = [1, 3, 5];

const allNumbers = [...even, ...odd];

console.log(allNumbers);

Output:

[2, 4, 6, 1, 3, 5]

This is one of the most common real-world uses of spread.


Spread with Objects

Spread also works with objects.

const user = {
  name: "Alex",
  age: 22
};

const updatedUser = {
  ...user,
  city: "Bhubaneswar"
};

console.log(updatedUser);

Output:

{ name: "Alex", age: 22, city: "Bhubaneswar" }

Here, the existing object is expanded, and then a new property is added.

This is especially useful when updating state in modern JavaScript apps.


What the Rest Operator Does

The rest operator does the opposite of spread.

Instead of expanding values, it collects multiple values into one place.

Think of it like gathering loose items and putting them into a bag.

Rest in Function Parameters

function sum(...numbers) {
  console.log(numbers);
}

sum(10, 20, 30);

Output:

[10, 20, 30]

Here, all arguments passed to the function are collected into a single array called numbers.

That is rest.


Why This Is Useful

Without rest, handling a variable number of arguments was awkward. With rest, it becomes simple.

function sum(...numbers) {
  let total = 0;

  for (let num of numbers) {
    total += num;
  }

  return total;
}

console.log(sum(5, 10, 15));

Output:

30

This makes functions much more flexible.


Rest with Array Destructuring

Rest can also collect leftover values from an array.

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

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

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

Output:

1
[2, 3, 4, 5]

Here:

  • first gets the first value

  • ...remaining collects everything else into an array


Rest with Objects

The same idea works with objects too.

const student = {
  name: "Riya",
  age: 20,
  course: "CSE"
};

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

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

Output:

Riya
{ age: 20, course: "CSE" }

This is very useful when you want one property separately and the rest grouped together.


Spread vs Rest: The Core Difference

This is the easiest way to understand it:

Spread

Takes one array or object and expands it.

const arr = [1, 2, 3];
console.log(...arr);

Rest

Takes many values and collects them.

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

So:

  • Spread = expand

  • Rest = collect

That is the whole game.


Practical Use Cases

These operators show up all the time in real code.

1. Copying arrays

const original = [1, 2, 3];
const copy = [...original];

2. Combining arrays

const frontend = ["HTML", "CSS"];
const backend = ["Node.js", "MongoDB"];

const skills = [...frontend, ...backend];

3. Updating objects safely

const profile = { name: "Sam", age: 21 };
const updatedProfile = { ...profile, age: 22 };

4. Accepting unlimited function arguments

function logMessages(...messages) {
  console.log(messages);
}

5. Separating one value from the rest

const [mainTask, ...otherTasks] = ["Study", "Code", "Sleep"];

These are not just syntax tricks. They make code shorter, cleaner, and easier to maintain.


A Real-World Way to Think About It

Imagine you have a backpack full of notebooks.

  • If you take everything out and spread it on the table, that is spread

  • If you gather several notebooks and put them into one backpack, that is rest

Same symbol. Different direction.

That mental image usually makes it stick.


Final Thoughts

Spread and rest operators are small features, but they are used everywhere in modern JavaScript.

The most important thing to remember is not the syntax, but the behavior:

  • Spread expands values outward

  • Rest gathers values inward

Once you understand that, arrays, objects, function arguments, and destructuring all start to feel much more intuitive.

This is one of those JavaScript topics that seems confusing for ten minutes and then suddenly feels obvious forever.