JavaScript | Деструктурирование массива

JavaScript | Деструктурирование массива

В JavaScript можно деструктурировать не только объекты, но и массивы. Существует формат присвоения, при помощи которого можно создавать имена новых переменных так, чтобы значения в этих переменных подхватывались из значений самого массива.

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

let arr = [5, 6, 7];
let [a, b, c] = arr;

Давайте посмотрим на простой результат данной деструктуризации массива. Количество создаваемых новых переменных равно количеству элементов массива.

Деструктуризовали массив из трёх элементов в JavaScript
Деструктуризовали массив из трёх элементов в JavaScript

Теперь у нас есть отдельные переменные с именами «a«, «b» и «c«, в которых лежат числовые значения, как в последовательности элементов массива. Называть переменные можно как угодно в случае с массивом.

Первой в списке была переменная «a«, поэтому ей было присвоено значение 5.

 

Деструктурирование массива с вычислением дополнительной переменной

В процессе деструктуризации массива в JavaScript можно создавать дополнительные имена переменных, которые будут вычисляться из других создаваемых переменных. Имеется ввиду, что количество создаваемых переменных может быть больше, чем элементов в массиве.

Например.

let arr = [4, 6, 8];
let [a, b, c, f = a + b] = arr;

Давайте посмотрим на результат данной деструктуризации массива с вычислением дополнительной переменной «f«.

Деструктуризовали массив с вычислением новой переменной в JavaScript
Деструктуризовали массив с вычислением новой переменной в JavaScript

В переменной «a» у нас находится число 4. В переменной «b»  находится число 6. Тогда в переменной «f» будет лежать число 10. (результат сложения 4 и 6).

Важно отметить, что переменная «f» выпадает из общего количества элементов массива, а значит может быть рассчитана на основе других значений из новых переменных.

 

Нюансы при деструктуризации массива в JavaScript

Последовательность объявлений переменных в квадратных скобках после оператора «let» имеет значение.

 

Нельзя присвоить иное вычисляемое значение и получить вычисленный результат, если переменная занимает позицию какого-то элемента в массиве

Например:

let arr = [4, 6, 8];
let [a, b=a+100, c] = arr;
Выражение не присвоилось так как в массиве есть элемент с похожей позицией как в деструктуризации - JavaScript
Выражение не присвоилось так как в массиве есть элемент с похожей позицией как в деструктуризации — JavaScript

Мы хотим сделать переменную «b» вычисляемой. Вроде «a» у нас уже объявилась, вроде число 100 не должно вызывать никаких проблем так как это примитивное значение, но мы всё равно не получаем итоговое значение в 104. Так происходит потому, что положение переменной «b» актуально для положения элемента в массиве. Число 6 находится на второй позиции и переменная «b» тоже находится на второй позиции. В итоге число 6 просто копируется в «b«.

 

Нельзя присваивать значение одной переменной до объявления другой переменной

Например:

let arr = [1, 2, 9];
let [a, b, c, f=a+x, x=a+100] = arr;

Мы получим ошибку «Uncaught ReferenceError: x is not defined«. Это справедливо, так как мы пытаемся обратиться к переменной «x» при вычислении значения «f«. В этот момент времени переменной «x» ещё не существует.

Ошибка ссылки на переменную при деструктуризации массива в JavaScript
Ошибка ссылки на переменную при деструктуризации массива в JavaScript

Это означает, что деструктуризация массива или объекта подчиняется обычным правилам видимости переменных.

 

Вычисляемое значение для переменной можно получить только за пределами длины массива, если он полный (если все индексы существуют)

Мы можем создавать любое количество вычисляемых переменных за пределами длины массива.

let arr = [5, 6];
let [a, b, c=a+b, f=a*b, x=c-f] = arr;

Результат присвоения

Деструктуризация массива с несколькими вычисленными переменными - JavaScript
Деструктуризация массива с несколькими вычисленными переменными — JavaScript

 

Для несуществующих индексов массива вычисления становятся возможными в местах «дырок»

Мы можем литерально объявить массив и накидать в него запятых. Это будет символизировать пустоты в индексах.

let arr = [5,,,,6];
let [a, b, c=a+b, f=a*b, x=c-f, y=a+b, z=a+x] = arr;

Результат:

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

Пустоты в массиве не ассоциируются с занятыми местами, а значит значения в данных переменных могут быть вычисленными.

 

Поведение при не целочисленных индексах массива

Объявим массив. Затем добавим значений в не целочисленные ключи.

let arr = [5,6];

arr[-2]=77;
arr['qwe']=88;

let [a, b, c, d] = arr;

Смотрим на результат деструктуризации по массиву с не целочисленными ключами

Деструктуризация массива с не целочисленными ключами - JavaScript
Деструктуризация массива с не целочисленными ключами — JavaScript

 

Информационные ссылки

Стандарт ECMAScript — Раздел «13.15.5 Destructuring Assignment» — https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-destructuring-assignment