Skip to main content

Command Palette

Search for a command to run...

Destructuring in JavaScript

Updated
•5 min read•View as Markdown
Destructuring in JavaScript

What destructuring means

Destructuring simply means to destructure or breakdown or split something, an array or object to get its contents.

Destructuring has various use cases like, destructuring array to add elements, or destructuring to assign default values in function arguments.

Destructuring Arrays

let arr = ["Kushagra", "Trivedi"]

// destructuring assignment
// sets firstName = arr[0]
// and surname = arr[1]
let [firstName, surname] = arr;

alert(firstName); // Kushahgra
alert(surname);  // Trivedi

We can also do:

let [firstname, lastname] = "Kushagra Trivedi".split(" ");
alert(firstname); // Kushagra
alert(lastname); // Trivedi

Actually, we can use it with any iterable, not only arrays:

let [a, b, c] = "abc"; // ["a", "b", "c"]
let [one, two, three] = new Set([1, 2, 3]);

That works, because internally a destructuring assignment works by iterating over the right value. It’s a kind of syntax sugar for calling for..of over the value to the right of = and assigning the values.


We can use any “assignables” on the left side.

For instance, an object property:

let user = {};
[user.name, user.surname] = "John Smith".split(' ');

alert(user.name); // John
alert(user.surname); // Smith

In the previous chapter, we saw the Object.entries(obj) method.

We can use it with destructuring to loop over the keys-and-values of an object:

let user = {
  name: "John",
  age: 30
};

// loop over the keys-and-values
for (let [key, value] of Object.entries(user)) {
  alert(`\({key}:\){value}`); // name:John, then age:30
}

//The similar code for a Map is simpler, as it’s iterable:

let user = new Map();
user.set("name", "John");
user.set("age", "30");

// Map iterates as [key, value] pairs, very convenient for destructuring
for (let [key, value] of user) {
  alert(`\({key}:\){value}`); // name:John, then age:30
}

There’s a well-known trick for swapping values of two variables using a destructuring assignment:

let guest = "Jane";
let admin = "Pete";

// Let's swap the values: make guest=Pete, admin=Jane
[guest, admin] = [admin, guest];

alert(`\({guest} \){admin}`); // Pete Jane (successfully swapped!)

Here we create a temporary array of two variables and immediately destructure it in swapped order.

We can swap more than two variables this way.


If the array is longer than the items on the left, then

let [first, second] = ['one', 'two', 'three', 'four'];
alert(first);     // one
alert(second);   // two
// Further items aren't assigned anywhere

So we use '...'

let [first, second, ...third] = ['one', 'two', 'three', 'four']
console.log(third) // ['three', 'four']

Now this is how we assign default values

let [name = "Kushagra", surname = "Trivedi"] = ["Julius"];

alert(name);    // Julius (from array)
alert(surname); // Trivedi (default used)

We can also provide functions as default values. They are evaluated only if the value is not provided.

For instance, here we use the prompt function for two defaults:

// runs only prompt for surname
let [name = prompt('name?'), surname = prompt('surname?')] = ["Julius"];

alert(name);    // Julius (from array)
alert(surname); // whatever prompt gets

Please note: the prompt will run only for the missing value (surname).

Object Destructuring

Now just as we do with arrays, we can also destructure objects

const {firstname, lastname} = {firstname : "kush", lastname : 'trivedi'}
console.log(firstname);   // kush
console.log(lastname);   // trivedi

order does not matter here

const {lastname, firstname} = {firstname : "kush", lastname : 'trivedi'}
console.log(firstname);   // kush
console.log(lastname);   // trivedi

we can set default values using "=", like this:

let options = {
  title: "Menu"
};

let {width = 100, height = 200, title} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200

Here also default values can be expressions

let options = {
  title: "Menu"
};

let {width = prompt("width?"), title = prompt("title?")} = options;

alert(title);  // Menu
alert(width);  // (whatever the result of prompt is)

Just like we did in Arrays, we can use '...' to destructure objects

let options = {
  title : "Menu",
  height : 200,
  width : 100
};

// title = property named title
// rest = object with the rest of properties
let {title, ...rest} = options;

// now title="Menu", rest={height: 200, width: 100}
alert(rest.height);  // 200

Nested destructuring is also possible

let obj = {
first : "kush",
last : "trivedi",
age : { years : 21, months : 3 },
}

let destobj = {first, last, age : { years, months } } = obj;
console.log(years);   // 21

When a function has many parameters, and many of these parameters are optional, i.e, are have default values, it becomes difficult to remember the order of parameters.

Destructuring comes to the rescue!

We can pass parameters as an object, and the function immediately destructurizes them into variables:

let obj = {
  title : "My menu",
  items : ["Item1", "Item2"]
};

function sample({title = "Untitled", width = 200, height = 100, items = []}) {
  // title, items – taken from obj,
  // width, height – defaults used
  alert( `\({title} \){width} ${height}` ); // My Menu 200 100
  alert( items ); // Item1, Item2
}

sample(obj);

That's all, hope you enjoyed it.

Sources

Destructuring assignment

More from this blog