Объект и Массив - это две часто используемые структуры данных JavaScript.
С помощью объектов вы можете создавать сущности, хранящие данные по ключу. С помощью массивов вы можете собирать данные в упорядоченную коллекцию.
В случае передачи их в функцию, она может потребовать объект и массив не как целое, а некоторые отдельные части.
Литеральные выражения объекта и массива позволяют создавать ад hoc пакеты. Вот синтаксис:
const x = [1, 2, 3, 4, 5];
Операция деструктуризации - это уникальный синтаксис, который помогает "распаковывать" объекты или массивы в группы переменных. Деструктуризация также может эффективно работать со сложными функциями, значениями по умолчанию и другими.
Деструктивное присваивание использует следующий синтаксис:
Вы можете найти аналогичные функции и в других языках. Например, в Python или Perl.
Теперь давайте посмотрим на пример деструктуризации массива в переменные:
В результате можно работать с переменными вместо членов массива.
Это будет работать еще лучше, если вы совместите его с split или другими методами, возвращающими массив:
let [firstName, surname] = "John Doe".split(' ');
Обратите внимание, что деструктуризация не то же самое, что и "деструктивная".
Мы называем это деструктуризацией, потому что она "деструктурирует" путем копирования элементов в переменные.
Вот более короткий способ записи:
// let [firstName, surname] = arr;
let firstName = arr[0];
let surname = arr[1];
Учтите, что вы можете отбросить ненужные элементы, используя дополнительную запятую, вот так:
Это может работать с любым итерируемым элементом справа:
let [a, b, c] = "abc"; // ["a", "b", "c"]
let [one, two, three] = new Set([1, 2, 3]);
Кроме того, вы можете использовать любые присваиваемые элементы слева.
Например, свойство объекта:
Еще одна полезная вещь - это возможность использовать метод Object.entries(obj) с деструктуризацией для перебора ключей и значений объекта.
Вот пример:
Оставшийся ‘…’
Если вам нужно получить не только первые значения, но и собрать все последующие, у вас есть возможность добавить еще один параметр для получения “остальных”, просто используя три точки “…”, вот так:
Значения по умолчанию
В случае, если в массиве меньше значений, чем переменных в присваивании, ошибки не произойдет. Отсутствующие значения будут считаться неопределенными:
Если вы хотите значение по умолчанию для замены пропущенного, используйте знак =, как это:
Деструктуризация объекта
Вы можете использовать деструктивное присваивание с объектами, также применяя следующий базовый синтаксис:
let { var1, var2} = { var1: …, var2: …}
Справа находится существующий объект, который необходимо разделить на переменные. Слева - шаблон для сопоставления свойств. Знак три точки {...} включает группу имен переменных.
Вот пример:
Свойства options.title, options.width и options.height назначаются соответствующим переменным. Порядок не имеет значения. Этот вариант также будет работать:
// changed the order in let {...}
let {
year,
model,
title
} = {
title: "Car",
model: "BMW M5",
year: 2020
}
Для присвоения свойства переменной с другим именем, вы можете поступить так:
Для возможно отсутствующих свойств, у вас есть возможность установить значения по умолчанию, используя знак “=”, как следует:
Значения по умолчанию могут быть любыми выражениями или вызовами функций.
В случае сложного объекта с рядом свойств, вы можете выбрать то, что вам нужно, как следует:
Оставшойся шаблон “…”
Может случиться и другой сценарий: количество свойств объекта больше, чем у вас переменных. В таких случаях вы можете использовать оставшийся шаблон. Но учтите, что он работает только в современных браузерах.
Вот пример:
Вложенная деструктуризация
Представьте, что массив или объект включает в себя другие вложенные массивы или объекты. Более сложные левосторонние шаблоны могут быть использованы для извлечения глубже лежащих частей.
В приведенном ниже примере, options содержит другой объект в свойстве views и массив в свойстве items:
Важно знать, что все свойства объекта options, кроме extra (его нет на левой стороне), присваиваются соответствующим переменным.
Так, model, year, item1, item2, и title имеют одинаковое значение. Но нет переменных для views и items.
Параметры умной функции
Иногда у функции много параметров, и большинство из них являются необязательными. Но допустим, что функция создает меню. У нее будет высота, ширина, список элементов, заголовок и т.д.
Мы не рекомендуем вам писать функцию так:
function showBook(title = "Javascript", page = 200, species : "programming"
, items = []) {
// ...
}
Основная проблема - запомнить порядок аргументов. Еще одна проблема - найти способ вызова функции, когда большинство параметров хороши по умолчанию.
Самый оптимальный вариант - передача параметров в виде объекта. Функция будет деструктурировать их в переменную сразу, вот так:
Есть другой, более сложный способ деструктуризации, включающий вложенные объекты и сопоставления с двоеточием.
Например:
Полный синтаксис выглядит так:
function ({
incomingProperty: varName = defaultValue
...
})
Как вы можете видеть, это то же самое, что и для деструктуризации присваивания.
Затем, для объекта параметров, будет переменная varName для incomingProperty.
Такую деструктуризацию считают, что у showBook() нет аргумента. Если вы хотите все значения по умолчанию, тогда укажите пустой объект, вот так:
showBook({}); // ok, all values are default
showBook(); // this would give an error
Вы можете исправить это, установив {} значение по умолчанию объекту параметров.
Например:
Время Викторины: Проверьте Свои Навыки!
отовы проверить свои знания? Погрузитесь в наши интерактивные викторины для более глубокого понимания и веселого способа закрепить знания.