Spread vs. Rest Operators
Three little dots, two completely different jobs. Learn how to expand and collect data like a pro in modern JavaScript.
Search for a command to run...
Three little dots, two completely different jobs. Learn how to expand and collect data like a pro in modern JavaScript.
No comments yet. Be the first to comment.
These are the assignments or knowledge dumps I decide to write for the "Chai aur Code's web Dev Cohort 2026"
Master the logic behind built-in string methods, learn to write your own polyfills, and crush your next technical interview.
RAG helps LLMs answer questions using your own data, but it doesn't guarantee correct answers. Here's how the pipeline works and where it commonly breaks down.

Imagine asking an AI, "Write a blog," versus "Act as an SEO expert and write a 1,000-word blog on AI safety formatted in markdown." The difference in the resulting output is night and day. A prompt is

Spotify and Apple Music make it incredibly easy to showcase your live listening habits on your website. YouTube Music? Not so much. After doing some setup you can do an API call and fetch your account

Arthur C. Clarke's famous third law: "Any sufficiently advanced technology is indistinguishable from magic" perfectly captures how the pace of human innovation works. From carrying supercomputers in o

Why HTTP is amnesiac, the difference between transport and state, and how to choose the right auth strategy for your Node.js app.
If you have been reading through modern JavaScript codefiles, you have undoubtedly come across three consecutive dots: ...
At first glance, this syntax can be incredibly confusing. Why? Because JavaScript uses the exact same three dots to perform two completely opposite actions. Depending on where you place them, those dots act as either the Spread Operator or the Rest Operator.
If you want to write clean, efficient code and master data manipulation in Web Dev Cohort 2026, understanding the difference between these two tools is crucial.
Let’s break down the magic of expanding and collecting values.
Before we look at the code, memorize this single concept:
Spread is used to unpack (expand) an array or object into individual elements.
Rest is used to pack (collect) individual elements into a single array or object.
The JavaScript engine determines which one you are using purely based on the context of where the dots are placed.
Think of a deck of playing cards. When you take the deck and fan it out across a table so you can see every individual card, you are spreading it.
The Spread operator takes an iterable (like an Array or an Object) and unpacks its elements into a new location. We use it when we are providing data.
[ SOURCE ARRAY ][ 1, 2, 3 ]
|
(Expanding) /|\
/ | \
[ INDIVIDUAL VALUES ] 1, 2, 3
The most common use case for Spread is copying or combining arrays.
Combining Arrays: Before Spread, joining arrays required methods like .concat(). Now, it is visual and seamless.
const fruits = ["Apple", "Banana"];
const vegetables = ["Carrot", "Potato"];
// We "spread" the contents of both arrays into a new one
const groceries = [...fruits, ...vegetables, "Milk"];
console.log(groceries);
// Output:["Apple", "Banana", "Carrot", "Potato", "Milk"]
Copying Arrays (Real-World Use Case): In JavaScript, arrays are passed by reference. If you try to copy an array with =, modifying the copy will mutate the original. Spread allows you to create a safe, shallow copy!
const original = [1, 2, 3];
const safeCopy = [...original];
safeCopy.push(4);
console.log(original); // Output: [1, 2, 3] (Untouched!)
console.log(safeCopy); // Output: [1, 2, 3, 4]
You can also use Spread to copy and merge objects. It is incredibly useful for updating a single property while keeping the rest of the object intact (a pattern used heavily in frameworks like React).
const user = { name: "Alice", age: 25 };
// Copy all properties of 'user', but overwrite the 'age'
const updatedUser = { ...user, age: 26, role: "Admin" };
console.log(updatedUser);
// Output: { name: 'Alice', age: 26, role: 'Admin' }
If Spread is fanning out the deck of cards, Rest is gathering all the cards on the table and stacking them neatly back into a single deck.
The Rest operator collects multiple individual elements and packs them into a single array. We use it when we are receiving data—specifically in function parameters or destructuring.
[ INDIVIDUAL VALUES ] 1, 2, 3, 4, 5
|
(Collecting) \|/
V
[ TARGET ARRAY ][ 1, 2, 3, 4, 5 ]
Imagine you want to write a function that adds numbers together. Sometimes you might pass 2 numbers, sometimes you might pass 10. How do you handle an infinite number of arguments?
With the Rest operator, you can capture "the rest" of the arguments into a neat little array.
// The ...numbers parameter collects all passed arguments into an array
function calculateTotal(...numbers) {
return numbers.reduce((sum, num) => sum + num, 0);
}
console.log(calculateTotal(10, 20)); // Output: 30
console.log(calculateTotal(5, 5, 5, 5, 5)); // Output: 25
Note: The Rest parameter must be the very last parameter in the function definition, because it collects everything that is left over.
Rest pairs beautifully with destructuring (which we covered in our previous blog!). You can extract the specific variables you need, and bundle "the rest" of the data into a new object or array.
const player = { username: "Hero123", level: 50, hp: 100, mana: 50 };
// Extract username, bundle the remaining stats into a 'stats' object
const { username, ...stats } = player;
console.log(username); // Output: Hero123
console.log(stats); // Output: { level: 50, hp: 100, mana: 50 }
If you are ever confused about which one you are looking at, look at the context. Are you creating/calling something, or are you defining/extracting something?
| Feature | Spread (...) |
Rest (...) |
|---|---|---|
| Primary Action | Unpacks / Expands | Packs / Collects |
| Where is it used? | Function Calls (func(...arr)), Array/Object Literals ([...arr]) |
Function Parameters (function(...args)), Destructuring (const {x, ...rest}) |
| What does it do? | Takes an array/object and spreads it into individual items. | Takes multiple individual items and bundles them into an array/object. |
Understanding the difference between the spread and rest uses of ... is a small but powerful skill in modern JavaScript. Remember the Golden Rule:
Spread (unpack/expand): use ... when providing elements from an iterable or object, e.g., [...], {...obj}, or function arguments fn(...arr).
Rest (pack/collect): use ... when collecting remaining elements into a single variable, e.g., function(a, ...rest) {}, [first, ...others] = arr, or { a, ...rest } = obj.
Practical takeaways
Use spread to create shallow copies, merge arrays/objects, or forward arguments without mutating the original.
Use rest to gather leftover arguments, destructure arrays/objects cleanly, and simplify function signatures.
Be mindful of shallow-copy behavior: spread clones top-level properties but not nested objects (use deep-clone strategies when needed).
Avoid confusing placement—context determines meaning: left side of an assignment or in parameter lists usually signals rest; inside array/object literals or call sites usually signals spread.
A quick mental model: spread fanns values out, rest tucks them into a single pocket. Mastering both leads to clearer, more expressive, and safer code.