Skip to main content

Command Palette

Search for a command to run...

JavaScript Destructuring: A Complete Guide

Updated
4 min read

If we've spent any time writing modern JavaScript, we've likely seen curly braces {} or square brackets [] on the left side of an equal sign and wondered what kind of magic is happening. That magic is destructuring, a feature introduced in ES6 that fundamentally changed how developers write JavaScript.

Here is the complete breakdown of what destructuring is, how to use all of its various syntaxes, and why it's a massive upgrade for our codebase.

The "Before": Why We Needed It

Before destructuring, extracting multiple properties from a single object or array was tedious. We had to declare a new variable for every single property, leading to repetitive boilerplate code.

The Old Way:

const user = { name: 'Alice', age: 28, role: 'Developer' };

// Repetitive and clunky
const name = user.name;
const age = user.age;
const role = user.role;

1. Destructuring Objects

Object destructuring uses curly braces {} to extract properties by their exact key names.

Basic Object Destructuring:

const user = { name: 'Alice', age: 28, role: 'Developer' };

// Clean and concise
const { name, age, role } = user;

console.log(name, age); // Output: Alice 28

Renaming Variables:
Sometimes we need to assign an extracted property to a variable with a different name to avoid naming collisions. We can do this using a colon :.

const user = { name: 'Alice', age: 28 };

const { name: fullName, age: userAge } = user;

console.log(fullName); // Output: Alice

Nested Object Destructuring:
If our object has objects inside of it, we can destructure multiple levels deep by mirroring the object's structure.

const user = { 
  name: 'Alice', 
  address: { city: 'Seattle', zip: '98101' } 
};

const { name, address: { city } } = user;

console.log(city); // Output: Seattle

The Rest Operator (...):
We can pack the remaining, unassigned items of an object into a brand new object using the rest operator.

const user = { 
  name: 'Alice', 
  age: 28, 
  role: 'Developer', 
  city: 'Seattle' 
};

// Extract 'name', and pack everything else into 'otherDetails'
const { name, ...otherDetails } = user;

console.log(name); 
// Output: Alice

console.log(otherDetails); 
// Output: { age: 28, role: 'Developer', city: 'Seattle' }

Destructuring with Computed (Dynamic) Property Names:
Sometimes we don't know the name of the key we want to extract until the code is running. We can use square brackets inside the assignment to handle dynamic keys.

const dynamicKey = 'email';
const user = { name: 'Alice', email: 'alice@example.com' };

const { [dynamicKey]: userEmail } = user;

console.log(userEmail); // Output: alice@example.com

Destructuring with Default Values:
Sometimes, the object we are destructuring might not have the property we are looking for, which results in undefined. Destructuring allows us to set fallback default values using the = sign.

const user = { name: 'Alice' }; // 'role' is missing

const { name, role = 'Guest' } = user;

console.log(role); // Output: Guest (instead of undefined)

2. Destructuring Arrays

Array destructuring uses square brackets []. Unlike objects, arrays don't have named keys. Instead, array destructuring relies strictly on position or index.

Basic Array Destructuring:

const colors = ['red', 'green', 'blue'];

const [firstColor, secondColor] = colors;

console.log(firstColor);  // Output: red
console.log(secondColor); // Output: green

Skipping Items:
If we only want specific items and want to ignore others, we can skip items by leaving a comma space.

const colors = ['red', 'green', 'blue', 'yellow'];

const [firstColor, , thirdColor] = colors;

console.log(thirdColor); // Output: blue

The Rest Operator (...):
We can pack the remaining, unassigned items of an array into a brand new array using the rest operator.

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

const [first, second, ...remainingNumbers] = numbers;

console.log(remainingNumbers); // Output: [3, 4, 5]

Destructuring with Default Values:
Sometimes, the array we are destructuring might not have the property we are looking for, which results in undefined. Destructuring allows us to set fallback default values using the = sign.

const scores = [95];

const [mathScore, scienceScore = 70] = scores;

console.log(scienceScore); // Output: 70

The Benefits of Destructuring

To sum it up, incorporating destructuring into our daily coding habits offers several distinct advantages:

  1. Drastically Reduces Repetitive Code: It eliminates the need to constantly write long object chains like data.user.profile.name.

  2. Improves Readability: When we destructure at the top of a function or file, it acts as instant documentation. Other developers can immediately see exactly which pieces of data are going to be used.

  3. Fails Safely: Combined with default values, destructuring makes our code more resilient against missing data or undefined errors.

  4. Cleaner API Signatures: Destructuring function parameters makes it immediately obvious what a function expects to receive, improving the overall design of our code.

JavaScript Fundamentals for Developers

Part 4 of 22

Learn JavaScript from the ground up with clear explanations and practical examples. This series covers core JavaScript concepts like variables, arrays, functions, loops, objects, and modern ES6 features to help you build a strong foundation in JavaScript.

Up next

Rest and Spread Operators in JavaScript

In JavaScript, three consecutive dots (...) can represent either the spread operator or the rest operator. The distinction lies entirely in the context of how we use them. Spread expands values out, w