Деструктуризация массивов в JavaScript

В данном уроке мы с вами разберем операцию деструктуризации массивов. Данная операция предназначена для массовой записи элементов массива в переменные в одну строчку кода.

Синтаксис этой операции следующий:

let [переменная1, переменная2, переменная3] = массив;

Как вы видите, слева от знака = в квадратных скобках перечисляются имена переменных. Эти переменные массово объявляются через let, который располагается перед открывающей скобкой.

В результате операции в первую переменную запишется первый элемент массива (то есть с ключом ноль), во вторую переменную - второй, в третью переменную - третий.

Давайте посмотрим на практическом примере. Пусть у нас есть массив, хранящий год, месяц и день:

let arr = [2025, 12, 31];

Давайте запишем год, месяц и день в соответствующие переменные, используя деструктуризацию:

let arr = [2025, 12, 31]; let [year, month, day] = arr;

Посмотрим на содержимое наших переменных:

console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 31

Для сравнения посмотрите, насколько неудобным и длинным получится код без деструктуризации:

let arr = [2025, 12, 31]; let year = arr[0]; let month = arr[1]; let day = arr[2]; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 31

В следующем коде части массива записываются в соответствующие переменные:

let arr = ['Иван', 'Иванов', 'отдел разработки', 'программист', 2000]; let name = arr[0]; let surname = arr[1]; let department = arr[2]; let position = arr[3]; let salary = arr[4];

Переделайте этот код через деструктуризацию согласно изученной теории.

Массив из функции

Массив для деструктуризации не обязательно должен хранится в переменной. Он также может быть результатом работы функции. Посмотрим на примере. Пусть дана вот такая функция:

function func() { return [2025, 12, 31]; }

Деструктуризируем возвращаемое этой функцией значение:

let [year, month, day] = func();

В следующем коде части массива записываются в соответствующие переменные:

function func() { return ['Иван', 'Иванов', 'отдел разработки', 'программист', 2000]; } let arr = func(); let name = arr[0]; let surname = arr[1]; let department = arr[2]; let position = arr[3]; let salary = arr[4];

Переделайте этот код через деструктуризацию согласно изученной теории.

Пропуск значений

Можно начать записывать в переменные не сначала массива, а пропустить некоторые значения. Давайте, к примеру, пропустим год, а месяц и день запишем в переменные. Для этого при указании переменных перед первой переменной поставим запятую, вот так: [, month, day]:

let arr = [2025, 12, 31]; let [, month, day] = arr; console.log(month); // выведет 12 console.log(day); // выведет 31

Можно пропустить не одно значение, а несколько:

let arr = [2025, 12, 31]; let [,, day] = arr; console.log(day); // выведет 31

В следующем коде части массива записываются в соответствующие переменные:

let arr = ['Иван', 'Иванов', 'отдел разработки', 'программист', 2000]; let department = arr[2]; let position = arr[3];

Переделайте этот код через деструктуризацию согласно изученной теории.

Меньше элементов

Если в массиве меньше элементов, чем переменных, то в "лишние" переменные запишется undefined:

let arr = [2025, 12]; let [year, month, day] = arr; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет undefined

Пропуск значений

Если в массиве больше элементов, чем переменных - лишние элементы никуда не запишутся и ничего страшного не произойдет. Для примера добавим в наш массив еще часы, минуты и секунды - от этого ничего не поменяется:

let arr = [2025, 12, 31, 23, 59, 59]; let [year, month, day] = arr; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 31

Остаток

Если в массиве больше элементов, чем переменных, при необходимости лишние элементы можно записать в массив с помощью оператора rest:

let arr = [2025, 12, 31, 23, 59, 59]; let [year, month, day, ...time] = arr; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 31 console.log(time); // выведет [23, 59, 59]

В следующем коде части массива записываются в соответствующие переменные:

let arr = ['Иван', 'Иванов', 'отдел разработки', 'программист', 2000]; let name = arr[0]; let surname = arr[1]; let info = arr.slice(2); // все элементы со второго до конца массива

Переделайте этот код через деструктуризацию согласно изученной теории.

Значение по умолчанию

Для переменных можно указывать значения по умолчанию. В этом случае, если переменной не хватит элемента массива - возьмется значение по умолчанию. В следующем примере переменной day по умолчанию указано значение 1:

let arr = [2025, 12]; let [year, month, day = 1] = arr; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 1

А вот если для переменной day будет значение в массиве - значение по умолчанию будет проигнорировано:

let arr = [2025, 12, 31]; let [year, month, day = 1] = arr; console.log(year); // выведет 2025 console.log(month); // выведет 12 console.log(day); // выведет 31

В следующем коде части массива записываются в соответствующие переменные:

let arr = ['Иван', 'Иванов', 'отдел разработки', 'программист']; let name = arr[0]; let surname = arr[1]; let department = arr[2]; let position; if (arr[3] !== undefined) { position = arr[3]; } else { position = 'джуниор'; }

Переделайте этот код через деструктуризацию согласно изученной теории.

Функции в качестве значения по умолчанию

В качестве значения по умолчанию можно также указывать функцию. Пусть, к примеру, у нас есть функция, возвращающая текущий день недели:

function func() { return (new Date).getDate(); }

Давайте укажем эту функцию в качестве значения переменной day:

let [year, month, day = func()] = arr;

Модифицируйте полученный выше код так, чтобы при отсутствии в массиве значения для месяца по умолчанию брался текущий месяц, а при отсутствии значения для года - соответственно текущий год.

Объявление переменных

Не обязательно объявлять переменные при деструктуризации. Они могут быть объявлены заранее и тогда при присваивании не нужно будет писать команду let:

let arr = [2025, 12, 31]; let year; let month; let day; [year, month, day] = arr;

Есть, однако, нюансы. Посмотрите на следующий код:

let arr = [2025, 12, 31]; let year; let [year, month, day] = arr;

Как вы видите, переменная year была объявлена заранее, но переменные month и day - нет. Поэтому автор кода решил написать let перед деструктуризирующим присваиванием.

Это, однако, приведет к ошибке, так как нельзя одну и туже переменную объявлять два раза через let (получится, что year объявлена два раза).

Через var, однако, переменные можно объявлять сколько угодно раз, поэтому следующий код не приведет к ошибке:

let arr = [2025, 12, 31]; var year; var [year, month, day] = arr;