Understanding the JavaScript Spread Operator (With Examples)

Introduction

The JavaScript spread operator (...) is one of the most powerful features introduced in ES6. At first glance, the three dots might seem like a small addition, but the spread operator can simplify your code and help you handle arrays, objects, and function arguments more efficiently.

In this article, we'll take a deep dive into the spread operator, explore its various use cases, and also look at the rest operator (which uses the same syntax but works differently). By the end, you'll have a solid understanding of how the spread operator can be used to streamline your JavaScript code.

What is the Spread Operator?

The spread operator (...) is a convenient way to expand elements of an array or object into individual elements. It’s often used to make copies of arrays or objects, combine data, or pass multiple arguments to functions.

Spread Operator with Arrays

One of the most common uses of the spread operator is with arrays. Let’s look at a few examples:

Example 1: Copying an Array

If you want to create a copy of an array, you can use the spread operator:

const originalArray = [1, 2, 3];
const copiedArray = [...originalArray];
console.log(copiedArray); // Output: [1, 2, 3]

Without the spread operator, you might end up copying an array by reference, which means changes to one array would affect the other. The spread operator helps avoid this by creating a shallow copy.

Example 2: Combining Arrays

You can also use the spread operator to combine multiple arrays into one:

const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const combinedArray = [...array1, ...array2];
console.log(combinedArray); // Output: [1, 2, 3, 4, 5, 6]

This makes it easy to merge arrays without using methods like concat().

Spread Operator with Objects

The spread operator can also be used with objects, allowing you to easily copy or merge objects.

Example 3: Copying an Object

To create a copy of an object:

const originalObject = { a: 1, b: 2 };
const copiedObject = { ...originalObject };
console.log(copiedObject); // Output: { a: 1, b: 2 }

This shallow copy helps avoid reference issues, just like with arrays.

Example 4: Merging Objects

You can merge objects using the spread operator:

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObject = { ...obj1, ...obj2 };
console.log(mergedObject); // Output: { a: 1, b: 3, c: 4 }

In this case, when two objects have the same property (b), the value from the second object (obj2) will overwrite the value from the first object.


What is the Rest Operator?

Now that we understand the spread operator, let’s talk about the rest operator. The rest operator uses the same ... syntax, but it works differently. Instead of expanding elements, it collects them.

The rest operator is often used in function arguments to collect all remaining arguments into an array. Here’s an example:

function sum(...numbers) {
  return numbers.reduce((acc, curr) => acc + curr, 0);
}
console.log(sum(1, 2, 3, 4)); // Output: 10

In this case, ...numbers collects all arguments passed to the function into an array, allowing you to handle them as a single unit.

Difference Between Spread and Rest Operator in JavaScript

Although both the spread and rest operators use the ... syntax, they serve different purposes:

  • Spread Operator: Expands an array or object into its individual elements.

  • Rest Operator: Gathers multiple elements into an array.

It’s easy to remember the difference: the spread operator "spreads out" values, while the rest operator "collects" them.

Example: Spread vs Rest

// Spread in function call
const numbers = [1, 2, 3];
console.log(Math.max(...numbers)); // Output: 3

// Rest in function definition
function multiply(multiplier, ...numbers) {
  return numbers.map(num => num * multiplier);
}
console.log(multiply(2, 1, 2, 3)); // Output: [2, 4, 6]

Conclusion

The JavaScript spread operator is a highly useful tool that can simplify many operations with arrays and objects, such as copying, merging, or passing values into functions. While the rest operator shares the same syntax, its purpose is to gather remaining elements into an array. By mastering both the spread and rest operators, you can write cleaner, more efficient code.


Resources

Are you interested in learning more? Check out these resources:


👋 Hello, I'm Eleftheria, DevRel, developer, public speaker, and content creator.

🥰 If you liked this article, consider sharing it.

🔗 All links | X | LinkedIn

30
Subscribe to my newsletter

Read articles from Eleftheria Batsou directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Eleftheria Batsou
Eleftheria Batsou

Hi there 🙆‍♀️, I'm Eleftheria, Community Manager with a coding background and a passion for UX. Do you have any questions? Don't hesitate to contact me. I can talk about front-end development, design, job hunting/freelancing/internships.