<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 17:14:48 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="-4qcIXea8MV519EliMYa5r6a10Bl7NDL7S3zTKin8J4UW1cWheRdpc-U9b2EyeqRfpP66m3bLmlQzWkY-qAX8A";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Дестракчеринг | JS: Коллекции</title>
<meta name="description" content="Дестракчеринг / JS: Коллекции: Знакомимся с возможностью JavaScript, которая позволяет извлекать данные из массивов или объектов способом, схожим с объявлением массива в объекте">
<link rel="canonical" href="https://ru.hexlet.io/courses/js-collections/lessons/destructuring/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Дестракчеринг">
<meta property="og:title" content="JS: Коллекции">
<meta property="og:description" content="Дестракчеринг / JS: Коллекции: Знакомимся с возможностью JavaScript, которая позволяет извлекать данные из массивов или объектов способом, схожим с объявлением массива в объекте">
<meta property="og:url" content="https://ru.hexlet.io/courses/js-collections/lessons/destructuring/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="dDADH0orRS6PYtCWLg2uJLSKjzVNB6-4z5BADQe13Rib4cgouFXoTjkh9A4iAl5TdIOin0UwURpycNpZVbI6dg" />
<script src="/vite/assets/inertia-INZxX8jp.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-6pOtQ3OW.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T17:14:48.010Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"DVrqNptPzQbED7-mdbJJq-heKuFW42xXOSAdYML16mviiyEBaTFgZnJMmz55vbncKFcHS17UkvWEwIc0kPINBQ","topics":[{"id":20121,"title":">Согласно уроку, Destructuion Assigment используется для извлечения данных из массивов и объектов.\n\nА использование ```string type``` допустимо? \n\n**REPL:** \n```\n> const [l, m] = [1, 2]\nundefined\n> l\n1\n> m\n2\n> const [r, t] = 'str'\nundefined\n> r\n's'\n> t\n't'\n> r\n's'\n> const [y, u] = 'q'\nundefined\n> y\n'q'\n> u\nundefined\n>\n```","plain_title":"Согласно уроку, Destructuion Assigment используется для извлечения данных из массивов и объектов. А использование string type допустимо? REPL: ``` const [l, m] = [1, 2] undefined l 1 m 2 const [r, t] = 'str' undefined r 's' t 't' r 's' const [y, u] = 'q' undefined y 'q' u undefined ","creator":{"public_name":"Mikhail Proskuryakov","id":174012,"is_tutor":false},"comments":[{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":42582,"body":"Добрый день!\n\nЭто неудивительно, потому что строки на более низком уровне реализованы как массивы символов.\n\n> А использование string type допустимо?\n\nДопустим для чего? :) Это малопрактично для строк, сходу даже не назову, где это может сильно пригодиться, нечастый кейс.","topic_id":20121}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":17921,"title":"Не совсем понял урок по видео,хотелось бы получить ответ на некоторые вопросы)\n\n1. \n```\nconst { a, b } = { a: 1, b: 2 }\n```\nпочему скобки фигурные? то есть a и b это просто константы? А то в моем понимании если а и б это просто константы. то должен работать такой код\n```\nconst [ a, b ] = { a: 1, b: 2 }\n```\nно он не работает, почему?\n\n2.\nна 5 мин. 10 сек в видео есть код, в котором есть такая часть\n```\nanimals.filter( ({ age } => age > 7) )\n```\nвообще не понимаю ка как это работает, вот такое понимаю:\n```\nanimals.filter( (elem) => {\n const { age } = elem;\n return age > 7;\n} )\n```\nнепонятно именно то откуда берется age в предыдущем коду, его же не кто не обьявляет, никто не присваевает ему elem, и что это тогда вообще такое, если это никто не обьявил\n","plain_title":"Не совсем понял урок по видео,хотелось бы получить ответ на некоторые вопросы) const { a, b } = { a: 1, b: 2 } почему скобки фигурные? то есть a и b это просто константы? А то в моем понимании если а и б это просто константы. то должен работать такой код const [ a, b ] = { a: 1, b: 2 } но он не работает, почему? 2. на 5 мин. 10 сек в видео есть код, в котором есть такая часть animals.filter( ({ age } => age > 7) ) вообще не понимаю ка как это работает, вот такое понимаю: animals.filter( (elem) => { const { age } = elem; return age > 7; } ) непонятно именно то откуда берется age в предыдущем коду, его же не кто не обьявляет, никто не присваевает ему elem, и что это тогда вообще такое, если это никто не обьявил ","creator":{"public_name":"Бельнов Иван","id":163226,"is_tutor":false},"comments":[{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":37897,"body":"Там нет ничего сложного, скорее по началу это кажется необычным. Просто откройте редактор и попробуйте поделать деструктивный присваивания из объектов и массивов и понимание быстро придёт.","topic_id":17921},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":37896,"body":"1. Это деструктивное присваивание объекта, оно имеет [особый синтаксис](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring). Для случая присваивания значений из массивов используются квадратные скобки. Это правила, определённые языком.\n2. `вообще не понимаю ка как это работает, вот такое понимаю` - оно в сущности работает по такому принципу, как вы его расписали ниже, только не для локальной константы функции, а для параметра функции. Ожидается, что на место `{ age }` придёт (будет передан аргументом) объект, имеющий свойство `age`. И так как нам нужен не весь объект, а только одно свойство, то вместо `age` пишем `{ age }` (что сводится при передаче аргумента, например, `obj`, к такому выражениею `{ age } = obj`) - то есть на выходе получим параметр `age` со значением свойства `age` переданного аргументом объекта.","topic_id":17921},{"creator":{"public_name":"Бельнов Иван","id":163226,"is_tutor":false},"id":37911,"body":"Спасибо! Просто все предыдущие вещи не приходилось принимать как должное, а было понятно почему именно так, и не так, а вот теперь такой код, как в вопросе №2 приходится принимать как должное, то есть это просто такой синтаксис или это должно поддаваться логике без знания нового синтаксиса(под новым синтаксисом имел виду эту штуку в функциях ({ что то }) )? И его реализация внутри языка примерно похожа на мое описание?","topic_id":17921},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":38002,"body":"> то есть это просто такой синтаксис\n\nДа :) и он, кстати, вполне логичен. Если деструктивное присваивание для массивов происходит через квадратные скобки, то для объектов оно должно происходить через фигурные скобки (объекты имеют сложную структуру, и можно сделать достаточно сложное комплексное присваивание, смотрите примеры по ссылке).","topic_id":17921}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":28505,"title":"Понравилось задание. Спасибо!\nМожете прокомментировать мой код, пожалуйста?\n```\nconst getCarsCountByYear = (coll) => {\n const years = coll.map(cars => cars.year);\n\n const iter = (counter, acc) => {\n if (counter.length === 0) {\n return acc;\n }\n const [first, ...rest] = counter;\n const newCounter = rest.filter(count => count !== first);\n const numFirst = counter.reduce((newAcc, num) => num === first ? newAcc + 1 : newAcc, 0);\n const objectFirst = { first };\n return iter(newCounter, ({ ...acc, [objectFirst.first]: numFirst }));\n };\n return iter(years, {});\n};\nexport default getCarsCountByYear;\n```","plain_title":"Понравилось задание. Спасибо! Можете прокомментировать мой код, пожалуйста? ``` const getCarsCountByYear = (coll) => { const years = coll.map(cars => cars.year); const iter = (counter, acc) => { if (counter.length === 0) { return acc; } const [first, ...rest] = counter; const newCounter = rest.filter(count => count !== first); const numFirst = counter.reduce((newAcc, num) => num === first ? newAcc + 1 : newAcc, 0); const objectFirst = { first }; return iter(newCounter, ({ ...acc, [objectFirst.first]: numFirst })); }; return iter(years, {}); }; export default getCarsCountByYear; ``` ","creator":{"public_name":"Александр Заплатин","id":53221,"is_tutor":false},"comments":[{"creator":{"public_name":"Nikita Mikhaylov","id":186965,"is_tutor":true},"id":61431,"body":"Добрый день. \n\nНе выставляйте решение на всеобщее обозрения, есть люди, которые ещё не решили это задание ;) Если хотите показать код, то воспользуйтесь ревью: https://help.hexlet.io/article/40-code-review\n\nЕсли у вас есть вопросы по поводу вашего кода, или хотите уточнить что-то, то спрашивайте об этом. К сожалению нет возможности просто комментировать код каждого студента :) ","topic_id":28505}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":20644,"title":"Здравствуйте! Вы изменили курсы по JS ? я после перерыва решил пройти заново - некоторые задания как-будто первый раз прошел.","plain_title":"Здравствуйте! Вы изменили курсы по JS ? я после перерыва решил пройти заново - некоторые задания как-будто первый раз прошел. ","creator":{"public_name":"Иван Нор","id":151614,"is_tutor":false},"comments":[{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":43737,"body":"Ну да, кое-какие изменения были :)","topic_id":20644},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":43661,"body":"Приветствую! В целом, контент постноянно обновляется: где-то сильно, где-то понемногу :) Какие конкертно задания вы имеете в виду?","topic_id":20644},{"creator":{"public_name":"Иван Нор","id":151614,"is_tutor":false},"id":43695,"body":"я как раз про \"в целом\" :) курс Коллекций. ","topic_id":20644}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":19940,"title":"Не относится к практике этого урока,относится к практикам далее, но вопрос по теме: \nПредположим есть функция getPathParts(path), которая возвращает массив строк , как правильно используя рест\\спред операторы и диструктивное присваивание записать вызов так, что бы сформировалось две переменных: первая - массив этих строк(без последней), и вторая - последняя строка из массива ? представляю себе это примерно так, но вечно выдает ошибку синтаксиса) \n```\n[...parts, Konec] = getPathParts(path);\n```\n\nПодскажите пожалуйста , весь мозг уже сломал , хотя вроде и глупость такая ","plain_title":"Не относится к практике этого урока,относится к практикам далее, но вопрос по теме: Предположим есть функция getPathParts(path), которая возвращает массив строк , как правильно используя рест\\спред операторы и диструктивное присваивание записать вызов так, что бы сформировалось две переменных: первая - массив этих строк(без последней), и вторая - последняя строка из массива ? представляю себе это примерно так, но вечно выдает ошибку синтаксиса) [...parts, Konec] = getPathParts(path); Подскажите пожалуйста , весь мозг уже сломал , хотя вроде и глупость такая ","creator":{"public_name":"Алексей Строителев","id":161017,"is_tutor":false},"comments":[{"creator":{"public_name":"Алексей Строителев","id":161017,"is_tutor":false},"id":42218,"body":"B вот так если передвинуть скобки ) ну и в общем вообще 500 вариантов кажется попробовал , все никак , и помнится уроков 10 назад тоже что то такое пытался и был не успех.\n\n```make: Entering directory '/usr/src/app'\nnpm test -s\n FAIL __tests__/HexletFs.test.js\n ● Test suite failed to run\n\n Jest encountered an unexpected token\n\n This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.\n\n By default, if Jest sees a Babel config, it will use that to transform your files, ignoring \"node_modules\".\n\n Here's what you can do:\n • To have some of your \"node_modules\" files transformed, you can specify a custom \"transformIgnorePatterns\" in your config.\n • If you need a custom transformation specify a \"transform\" option in your config.\n • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the \"moduleNameMapper\" config option.\n\n You'll find more details and examples of these config options in the docs:\n https://jestjs.io/docs/en/configuration.html\n\n Details:\n\n SyntaxError: /usr/src/app/HexletFs.js: Unexpected token (35:23)\n\n 33 | // BEGIN (write your solution here)\n 34 | mkdirpSync(filepath) {\n > 35 | const [...rest], konec = getPathParts(filepath);\n | ^\n 36 | const dirParts = getPathParts(filepath);\n 37 | dirParts.reduce((acc, el) => {\n 38 | acc.push(el);\n\n at Parser.raise (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:3938:15)\n at Parser.unexpected (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:5247:16)\n at Parser.parseVar (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7768:18)\n at Parser.parseVarStatement (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7594:10)\n at Parser.parseStatementContent (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7194:21)\n at Parser.parseStatement (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7144:17)\n at Parser.parseBlockOrModuleBlockBody (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7695:23)\n at Parser.parseBlockBody (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7682:10)\n at Parser.parseBlock (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7671:10)\n at Parser.parseFunctionBody (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:6924:24)\n```","topic_id":19940},{"creator":{"public_name":"Алексей Строителев","id":161017,"is_tutor":false},"id":42237,"body":"очень жаль, иногда удобно было бы)","topic_id":19940},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":42162,"body":"А какую ошибку синтаксиса? Подозреваю что вы просто не поставили `const` в начале.","topic_id":19940},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":42227,"body":"```\nconst [...rest, head] = [1, 2, 3]\nVM146:1 Uncaught SyntaxError: Rest element must be last element\n```\n\nПопробовал прямо тут в браузере. Нельзя так делать)","topic_id":19940},{"creator":{"public_name":"Алексей Строителев","id":161017,"is_tutor":false},"id":42217,"body":"Нет , конст ставил, вот так выдает \n```\nmake: Entering directory '/usr/src/app'\nnpm test -s\n FAIL __tests__/HexletFs.test.js\n ● Test suite failed to run\n\n SyntaxError: /usr/src/app/HexletFs.js: Unexpected token, expected \"]\" (35:22)\n\n 33 | // BEGIN (write your solution here)\n 34 | mkdirpSync(filepath) {\n > 35 | const [...rest, konec] = getPathParts(filepath);\n | ^\n 36 | const dirParts = getPathParts(filepath);\n 37 | dirParts.reduce((acc, el) => {\n 38 | acc.push(el);\n\n at Parser.raise (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:3938:15)\n at Parser.unexpected (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:5247:16)\n at Parser.expect (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:5235:28)\n at Parser.parseBindingList (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:5528:14)\n at Parser.parseBindingAtom (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:5499:32)\n at Parser.parseVarHead (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7785:20)\n at Parser.parseVar (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7761:12)\n at Parser.parseVarStatement (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7594:10)\n at Parser.parseStatementContent (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7194:21)\n at Parser.parseStatement (../../lib/node_modules/@babel/core/node_modules/@babel/parser/lib/index.js:7144:17)\n```","topic_id":19940}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":20633,"title":"У меня по ходу код с логической ошибкой прошел. Добавьте больше кейсов в тесты) Более трех одинаковых годов в массиве, хотя бы. Потому что я именно на этом поняла, что полегла)","plain_title":"У меня по ходу код с логической ошибкой прошел. Добавьте больше кейсов в тесты) Более трех одинаковых годов в массиве, хотя бы. Потому что я именно на этом поняла, что полегла) ","creator":{"public_name":"Элла Бирюкова","id":158746,"is_tutor":false},"comments":[{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":43686,"body":"Вы можете показать полный вариант некорректного кода, который проходит на проверку - отправьте его на ревью, стесняться не стоит :)","topic_id":20633},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":43659,"body":"Добрый день!\n\n> У меня по ходу код с логической ошибкой прошел. Добавьте больше кейсов в тесты)\n\nПокажите, пожалуйста, код с логической ошибкой, который успешно проходит проверку. Можете даже [отправить его на код-ревью](https://help.hexlet.io/article/40-code-review), а здесь оставить ссылку.\n\nЕсли не затруднит, сразу опишите в чём заключается ошибка, а если предложите свои кейсы, то добавим их в тесты :)","topic_id":20633},{"creator":{"public_name":"Элла Бирюкова","id":158746,"is_tutor":false},"id":43689,"body":"Если я правильную ссылку с телефона скопировала, то вот. \n[Ревью v1](https://ru.hexlet.io/code_reviews/70992?submission_id=95551#file-0)","topic_id":20633},{"creator":{"public_name":"Элла Бирюкова","id":158746,"is_tutor":false},"id":43684,"body":"`// removed`\n\nРешала я с редьюсом, поэтому мне стыдно =)\nздесь я тупанула и решила менять состояние yearCount, конечно до двух он считал неплохо, а когда я решила в массиве поменять один из голов так, чтобы было 3 раза 2014, то он их мне нормально не сосчитал.)\nНу и то, что он каждый раз переопределялся в единицу тоже не очень.\nНо тест прошел, потому что так массив был сформирован, что и годов было не больше трех одних и тех же и друг зна другом элементы видимо шли удачно так))\nЯ предложила бы для проверки как минимум массив увеличить, добавив модель того года, который раза 2 встречался бы уже.\n\nЯ вообще не знаю, что меня после прохождения тестов заставило вернуться к коду, наверное то, что я понимала, что что-то не так у меня =)","topic_id":20633},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":43739,"body":"Спасибо, Элла! Я поправил тесты, добавив кейс с тремя машинами одного года.","topic_id":20633}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":19201,"title":"[Решила](https://ru.hexlet.io/code_reviews/65089) без использования третьей подсказки, надеюсь, не критично.\n\nСпасибо за курс, он просто отличный, заставил здорово поскрипеть мозгами и позаниматься самобичеванием на тему \"я слишком глуп для программирования\" :)","plain_title":"Решила (https://ru.hexlet.io/code_reviews/65089) без использования третьей подсказки, надеюсь, не критично. Спасибо за курс, он просто отличный, заставил здорово поскрипеть мозгами и позаниматься самобичеванием на тему \"я слишком глуп для программирования\" :) ","creator":{"public_name":"Мария Ковшарова","id":170362,"is_tutor":false},"comments":[{"creator":{"public_name":"Мария Ковшарова","id":170362,"is_tutor":false},"id":40576,"body":"Поправила, согласна, свежий взгляд помог, действительно, выглядело не очень :)\nЛинтер ругался на операцию ++, к этому вопрос, почему этот оператор считается плохим паттерном? Просто довольно часто вижу именно в \"рабочей\" среде использование инкремента/декремента. Как и тернарники, но с ними раз на раз не приходится, иногда совершенно нечитабельные их делают, а уж тернарник в тернарнике вообще песня!","topic_id":19201},{"creator":{"public_name":"Vasiliy Usachev","id":67051,"is_tutor":false},"id":40571,"body":"Никак не пойму, почему ругают тернарные операции. [Мое](https://ru.hexlet.io/code_reviews/54607?submission_id=76193) второе решение, по-моему, даже лучше учительского. :))) Такое маленькое и понятное.","topic_id":19201},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":40598,"body":"> к этому вопрос, почему этот оператор считается плохим паттерном? \n\nПопробуйте погуглить сообщения линтера и вы попадете на документацию eslint где все объясняется с примерами.","topic_id":19201},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":40551,"body":"`has(acc, year) ? acc[year]++ : acc[year] = 1;`\n\nВот это страшная строчка, все худшие паттерны собрались в одном месте). Посмотрите в рекомендации линтера, он сильно ругался на этот код.","topic_id":19201},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":40597,"body":"> . Мое второе решение, по-моему, даже лучше учительского. :))) Такое маленькое и понятное.\n\nВ задании просят реализовать итеративный процесс самостоятельно (то етсь без использования reduce). Цель этой задачи отработать деструктуризацию, а не написать самое короткое решение.","topic_id":19201}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":11240,"title":"Если возможно, прокаментируйте мое решение через reduce, плюсы - минусы по сравнению предложенным решением.\n[Решение](https://ru.hexlet.io/code_reviews/27354)\nСпасибо.","plain_title":"Если возможно, прокаментируйте мое решение через reduce, плюсы - минусы по сравнению предложенным решением. Решение (https://ru.hexlet.io/code_reviews/27354) Спасибо. ","creator":{"public_name":"Maxim Putintsev","id":70683,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":23382,"body":"У вас тоже самое по сути, но в одну строчку такая запись - это перебор. Не надо экономить на константах + не забывайте фиксить ошибки линтера.","topic_id":11240}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":10838,"title":"Добрый вечер!Написал функцию итеративно создает объект,но счетчик не работает, грешу на НЕПРАВИЛЬНОЕ сравнение созданного нового ключа с уже находящимся в acc ключе.Прошу помощи.\n```\n// removed\n```","plain_title":"Добрый вечер!Написал функцию итеративно создает объект,но счетчик не работает, грешу на НЕПРАВИЛЬНОЕ сравнение созданного нового ключа с уже находящимся в acc ключе.Прошу помощи. // removed ","creator":{"public_name":"Рустам Худайбергенов","id":133067,"is_tutor":false},"comments":[{"creator":{"public_name":"Рустам Худайбергенов","id":133067,"is_tutor":false},"id":22627,"body":"\n\n1. const [first, ...rest] = list я её уже убрал,можно и без нее;\n2. let result тоже убрал сразу пишу единицу { ...acc, [newKey]: 1 };\n3. хотел сравнивать находящееся уже в acc newKey с новым newKey;\n\nКирилл Вы знаете я переписал функцию через reduce и решил упростить все это дело,но я не понимаю как сделать счетчик правильно\n```\nexport default (list) => {\n return list.reduce((acc, v) => {\n const key = v.year;\n acc[key] = 1;\n return Object.keys(acc).every(k => k === key) ? ....счетчик?.. : acc;\n }, {});\n}```","topic_id":10838},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22600,"body":"Добрый день. Предлагаю начать с другого. Расскажите алгоритм, который вы пытаетесь реализовать.","topic_id":10838},{"creator":{"public_name":"Рустам Худайбергенов","id":133067,"is_tutor":false},"id":22606,"body":"1. Берем первый элемент list, достаем через {year} этот ключ называем newKey, записываем год выпуска в новый ключ в acc;\n2. Через тернарный оператор сравниваем newKey с уже существующим ключом в acc, если да, то счетчик + 1, иначе просто делаем из newKey новый ключ в acc.\n3. Повторяем шаги.","topic_id":10838},{"creator":{"public_name":"Рустам Худайбергенов","id":133067,"is_tutor":false},"id":22650,"body":"acc.newKey я понял это неправильно и обращаться надо через [key], обращение даст мне значение","topic_id":10838},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22628,"body":"`хотел сравнивать находящееся уже в acc newKey с новым newKey;` задумка очевидно, но вопрос был в другом), как _на самом деле_ работает эта штука?","topic_id":10838},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22622,"body":"Хорошо. Тогда вопросы:\n\n1. `const [first, ...rest] = list;` - зачем нужна эта строчка?\n1. `let result = 1;` зачем изменять result?\n1. `acc.newKey` - что означает этот вызов?","topic_id":10838}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}},{"id":18827,"title":"Кирилл, спасибо большое за курс, очень интересно и последовательно!\n\nОднако, у меня есть вопрос к названию этого урока. Все видео, и потом всю практику я пытался понять, что же почему присваивание называется деструктивным — что же оно разрушает? В видео даже была произнесена фраза «разрушающее присваивание», но никак не были объяснены причины такого странного названия. И только когда я решил почитать документацию, обнаружил, что на самом деле оно не \"destructive\" a \"deconstructive\", что сразу же сделало материал куда более понятным.\n\nВозможно имело бы смысл если не поменять название на «Деструктурирующее присваивание» (что кажется довольно логичным), то хотя бы уделить в теории какое-то внимание тому, что в процессе ничего не разрушается? ","plain_title":"Кирилл, спасибо большое за курс, очень интересно и последовательно! Однако, у меня есть вопрос к названию этого урока. Все видео, и потом всю практику я пытался понять, что же почему присваивание называется деструктивным — что же оно разрушает? В видео даже была произнесена фраза «разрушающее присваивание», но никак не были объяснены причины такого странного названия. И только когда я решил почитать документацию, обнаружил, что на самом деле оно не \"destructive\" a \"deconstructive\", что сразу же сделало материал куда более понятным. Возможно имело бы смысл если не поменять название на «Деструктурирующее присваивание» (что кажется довольно логичным), то хотя бы уделить в теории какое-то внимание тому, что в процессе ничего не разрушается? ","creator":{"public_name":"Vadim","id":20997,"is_tutor":false},"comments":[{"creator":{"public_name":"Vadim","id":20997,"is_tutor":false},"id":39819,"body":"Да, прошу прощения, я выразился неточно, конечно не deconstructive а destructuring. \n\nПроблема в том, что destructuring подразумевает деструктуризацию объекта то есть извлечение его структуры, в то время как destructive (который получается обратным переводом из «разрушающего присваивания» или названия урока «деструктивное присваивания») подразумевает, что где-то что-то разрушается, чего на самом деле не происходит.\n\nЯ понимаю, что термин в некотором роде устоявшийся, просто для меня была не очевидна часть с разрушением, так как термины очень созвучны и стало куда понятнее когда я вгляделся в английское написание. Перевод «деструктурирующее присваивание» показался мне более точно отражающим происходящее, возможно, кому-то тоже поможет обратить на это внимание.","topic_id":18827},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":39739,"body":"\"Деструктивный\" это калька с английского термина \"destructive\"\n\n> И только когда я решил почитать документацию, обнаружил, что на самом деле оно не \"destructive\" a \"deconstructive\"\n\nМожно ссылку, где вместо destructuring assignment употребляется deconstructive? Вот термин destructuring: [раз](http://exploringjs.com/es6/ch_destructuring.html), [два](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)","topic_id":18827},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":39821,"body":"> Я понимаю, что термин в некотором роде устоявшийся\n\nХорошо, что понимаете это","topic_id":18827}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Дестракчеринг","entity_url":null,"active":true}}],"lesson":{"exercise":{"id":650,"slug":"js_collections_destructuring_exercise","name":null,"state":"active","kind":"exercise","language":"javascript","locale":"ru","has_web_view":false,"has_test_view":false,"reviewable":true,"readme":"## getCarsCountByYear.js\n\nЭто упражнение рассчитано на максимальное использование знаний последних уроков. К сожалению, невозможно тестами убедиться в том, что ваше решение будет содержать деструктивное присваивание или rest оператор, поэтому вам нужно самостоятельно прикладывать усилия для их использования.\n\nРеализуйте и экспортируйте по умолчанию функцию, которая принимает на вход список машин (в виде обычного js массива с объектами), а возвращает объект, в котором свойство - это год выпуска, а значение - это количество машин для соответствующего года.\n\nПорядок свойств в результирующем объекте не важен.\n\n```javascript\nconst cars = [\n { brand: 'bmw', model: 'm5', year: 2014 },\n { brand: 'bmw', model: 'm4', year: 2013 },\n { brand: 'kia', model: 'sorento', year: 2014 },\n { brand: 'kia', model: 'rio', year: 2010 },\n { brand: 'kia', model: 'sportage', year: 2012 },\n]\n\nconsole.log(getCarsCountByYear(cars))\n// {\n// 2010: 1,\n// 2012: 1,\n// 2013: 1,\n// 2014: 2,\n// };\n```\n\nРешите эту задачу, используя итеративный процесс. Он хорош тем, что позволяет задействовать сразу все, что нужно.\n\n### Подсказки\n\nВам понадобятся:\n\n* `const [first, ...rest] = arr`\n* `const { propertyName } = obj`\n* `{ ...acc, [propertyName]: value }`\n","prepared_readme":"## getCarsCountByYear.js\n\nЭто упражнение рассчитано на максимальное использование знаний последних уроков. К сожалению, невозможно тестами убедиться в том, что ваше решение будет содержать деструктивное присваивание или rest оператор, поэтому вам нужно самостоятельно прикладывать усилия для их использования.\n\nРеализуйте и экспортируйте по умолчанию функцию, которая принимает на вход список машин (в виде обычного js массива с объектами), а возвращает объект, в котором свойство - это год выпуска, а значение - это количество машин для соответствующего года.\n\nПорядок свойств в результирующем объекте не важен.\n\n```javascript\nconst cars = [\n { brand: 'bmw', model: 'm5', year: 2014 },\n { brand: 'bmw', model: 'm4', year: 2013 },\n { brand: 'kia', model: 'sorento', year: 2014 },\n { brand: 'kia', model: 'rio', year: 2010 },\n { brand: 'kia', model: 'sportage', year: 2012 },\n]\n\nconsole.log(getCarsCountByYear(cars))\n// {\n// 2010: 1,\n// 2012: 1,\n// 2013: 1,\n// 2014: 2,\n// };\n```\n\nРешите эту задачу, используя итеративный процесс. Он хорош тем, что позволяет задействовать сразу все, что нужно.\n\n### Подсказки\n\nВам понадобятся:\n\n* `const [first, ...rest] = arr`\n* `const { propertyName } = obj`\n* `{ ...acc, [propertyName]: value }`\n","has_solution":true,"entity_name":"Дестракчеринг"},"units":[{"id":1430,"name":"theory","url":"/courses/js-collections/lessons/destructuring/theory_unit"},{"id":1431,"name":"quiz","url":"/courses/js-collections/lessons/destructuring/quiz_unit"},{"id":2060,"name":"exercise","url":"/courses/js-collections/lessons/destructuring/exercise_unit"}],"links":[{"id":423174,"name":"Официальная документация","url":"https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment"}],"ordered_units":[{"id":1430,"name":"theory","url":"/courses/js-collections/lessons/destructuring/theory_unit"},{"id":1431,"name":"quiz","url":"/courses/js-collections/lessons/destructuring/quiz_unit"},{"id":2060,"name":"exercise","url":"/courses/js-collections/lessons/destructuring/exercise_unit"}],"id":717,"slug":"destructuring","state":"approved","name":"Дестракчеринг","course_order":980,"goal":"Знакомимся с возможностью JavaScript, которая позволяет извлекать данные из массивов или объектов способом, схожим с объявлением массива в объекте","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"174202651","theory":"В функциональных языках очень популярна техника Destructuring assignment. Она слабо представлена в императивных языках, а в JavaScript вообще отсутствовала. Но после появления ES6-стандарта возможности в JavaScript по Destructuring assignment стали мощными и сравнялись с функциональными языками.\n\nВ этом уроке мы научим пользоваться этой техникой. Она помогает делать код более понятным, при этом позволяет писать его более компактно.\n\n## Определение Destructuring assignment\n\nСинтаксис деструктивного присваивания в JavaScript похож на синтаксис создания массива или объекта. При этом это разные операции.\n\nРазберем, как обычно решаются типичные задачи в коде. Например, у нас есть массив из двух элементов. Мы хотим каждый из них присвоить своей переменой, чтобы независимо работать с ними:\n\n```javascript\nconst animals = ['Dog Name', 'Cat Name']\n\nconst myDog = animals[0]\nconst myCat = animals[1]\n```\n\nПоказанный здесь подход является предпочтительным. Но это можно сделать еще проще, если использовать разрешающие присваивания или просто Destructuring. Делается это так:\n\n```javascript\nconst animals = ['Dog Name', 'Cat Name']\n\nconst [myDog, myCat] = animals\n```\n\nСлева от составного объекта, который мы хотим разложить, описывается структура. Она соответствует правой части. В ней вместо конкретных значений подставляем идентификаторы. В примере это константы `myDog` и `myCat`.\n\nВ итоге можно увидеть, что эти структуры совпадают по внутреннему устройству. Получается, что в каждую из этих констант записывается значение на соответствующей позиции из массива правой части.\n\nКак видим, Destructuring assignment помогает сократить код и сделать его более понятным. При этом индексы здесь уже не участвуют.\n\n## Rest\n\nМы можем использовать rest-оператор:\n\n```javascript\nconst x = [1, 2, 3, 4, 5]\nconst [y, z] = x\nconsole.log(y) // 1\nconsole.log(z) // 2\n```\n\nВ итоге в `y` попадает первый элемент, в `z` — второй элемент. Остальные элементы остаются в исходном массиве и не задействованы в присваивании. Но это можно поменять и использовать rest-operator — операцию rest. Она соберет все оставшиеся элементы в массив, который мы потом можем воспользоваться:\n\n```javascript\nconst x = [1, 2, 3, 4, 5]\nconst [y, z, ...rest] = [1, 2, 3, 4, 5]\nconsole.log(y) // 1\nconsole.log(z) // 2\nconsole.log(rest) // [3, 4, 5]\n```\n\nRest может использоваться не только в определении функций, но и в Destructuring. При этом он используется в самом конце, и его нельзя поставить в середине. Такой же механизм работает и с объектами.\n\n## Объекты\n\nРассмотрим пример, как раскладывается объект:\n\n```javascript\nconst { a, b } = { a: 1, b: 2 }\nconsole.log(a) // 1\nconsole.log(b) // 2\n```\n\nСлева мы указываем только идентификаторы, которые должны совпадать с именем ключа в правой части. Туда записывается соответствующее значение по ключу с таким же именем.\n\n## Значения по умолчанию\n\nЕще Destructuring assignment позволяет указывать значения по умолчанию. Например:\n\n```javascript\nconst [a = 5, b = 7] = [1]\nconsole.log(a) // 1\nconsole.log(b) // 7\n```\n\nВ левой части у нас два элемента, в правой части — один элемент. При присваивании ошибки не происходят. В `a` записывается единица, а в `b` записывается семь, потому что это значение по умолчанию.\n\n## Обмен переменных местами\n\nРассмотрим пример, который есть почти во всех языках — это обмен переменных местами без использования третьей переменной. В JavaScript это делается так:\n\n```javascript\nlet a = 1\nlet b = 3;\n\n[a, b] = [b, a]\nconsole.log(a) // 3\nconsole.log(b) // 1\n```\n\n## Возврат функций\n\nТу же технику можно использовать при вызове функций, которые возвращают составные объекты. В нашем случае это массив:\n\n```javascript\nconst f = () => [1, 2]\n\nconst [a, b] = f()\nconsole.log(a) // 1\nconsole.log(b) // 2\n```\n\nЭто не отличается от просто использования массива. Это означает, что Destructuring assignment работает независимо от того, откуда идут данные. Получается, нам неважен источник этих данных. Это просто использование литерала. Главное, что мы слева, описав его структуру, можем разложить его на составляющие.\n\nЭто важно, так как открывает много возможностей в использовании Destructuring assignment в разных местах программы. Например, в определении функций.\n\n## Определение функций\n\nДопустим, у нас есть массив животных — `cat` и `dog`:\n\n```javascript\nconst animals = [\n { age: 5, type: 'cat' },\n { age: 10, type: 'dog' },\n]\nconst result = animals.filter(({ age }) => age > 7)\n\n// [ { age: 10, type: 'dog' } ]\nconsole.log(result)\n```\n\nЗдесь мы как раз делаем Destructuring assignment. Вместо того, чтобы записывать объект и обращаться к его свойству `age`, мы напрямую в параметрах функции делаем разложение объекта. Получается, мы извлекаем `age` сразу из объекта, а остальную часть игнорируем.\n\nЭто можно делать не только в лямбда-функциях и в функциях высшего порядка. В любом определении функции можно сразу делать разложение, что является удобным механизмом.\n\n## Составной объект\n\nЕще Destructuring assignment в JavaScript позволяет раскладывать составные объекты, что делает его мощным механизмом. Рассмотрим пример:\n\n```javascript\nconst metadata = {\n title: 'Scratchpad',\n translations: [\n { locale: 'de', title: 'JavaScript-Umgebung' },\n ],\n url: '/en-US/docs/Tools/Scratchpad',\n}\n```\n\nЗдесь у нас есть `metadata` — составной объект, который внутри содержит массив. А этот массив содержит объекты. И с помощью Destructuring assignment мы можем его разложить на элементы:\n\n```javascript\nconst {\n title: englishTitle,\n translations: [{ title: localeTitle }],\n} = metadata\n\nconsole.log(englishTitle) // \"Scratchpad\"\nconsole.log(localeTitle) // \"JavaScript-Umgebung\"\n```\n\nЗдесь мы слева описываем структуру, в которой говорим, что `title` — это `englishTitle`. Получается, мы делаем переименование — говорим, что по ключу `title` значение нужно записать в переменную с именем `englishTitle`. В нашем случае это константа.\n\nТакже мы раскладываем `translations` и описываем, что происходит внутри. В итоге внутренний `title` мы записываем в `localTitle`.\n\nПолучается, что мы описали структуру, подобную верхней, и переименовали `title`, чтобы они не пересекались. Далее мы их распечатаем, и в итоге появляются соответствующие значения из исходного составного объекта.\n\n## Выводы\n\nВ этом уроке мы научились пользоваться техникой Destructuring assignment. Она помогает делать код более понятным, при этом позволяет писать его более компактно.\n\nПлюсов у Destructuring assignment много: код становится чище, меньше и компактнее. При этом в отличие от других подходов, которые позволяют писать более компактный код, Destructuring assignment еще и улучшает его читаемость.\n\nЭтой техникой можно пользоваться и в других языках. Она есть практически везде, и позволяет писать код в более приятном стиле.\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":1404,"name":"theory","url":"/courses/js-collections/lessons/intro/theory_unit"}],"links":[],"ordered_units":[{"id":1404,"name":"theory","url":"/courses/js-collections/lessons/intro/theory_unit"}],"id":707,"slug":"intro","state":"approved","name":"Введение","course_order":100,"goal":"Знакомимся с целями курса и обсуждаем проект, над которым мы будем работать","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"174202449","theory":"В предыдущих курсах мы уже научились работать с составными данными и поняли, зачем они нужны. Также мы изучили концептуальные способы работы, которые не зависят от конкретного языка программирования.\n\nВ этом курсе мы разберем конкретные приемы, которые используются для работы с коллекциями в языке JavaScript. При этом они будут подходить и ко многим другим языкам.\n\n## Какие темы будем изучать\n\nСписки есть везде и их бывает много. Они окружают нас повсеместно. Например, в Хекслете есть списки:\n\n* Пользователей\n* Курсов\n* Уроков\n* Топиков\n* Комментариев\n\nЕще есть не связанные с конкретными вещами списки, которые вводятся на сайте. Они существуют только внутри кода.\n\nВ этом курсе мы изучим несколько новых типов данных: массивы, ассоциативные массивы и множества.\n\nТакже мы познакомимся со следующими темами:\n\n* **Передача параметров по ссылке и по значению** — более сложный механизм, чем мы изучали до этого\n* **Функции высшего порядка** — встроены в JavaScript и являются каноническим способом работы с коллекциями\n* **Spread- и rest-операции** — распространены в других языках программирования и позволяют сократить шаблонный код\n* **Destructing assignment** — деструктуризация. Техника, которая используется в функциональных программированиях и языках. Она часто соприкасается с другой техникой, которая называется pattern matching\n\nТакже в этом курсе мы познакомимся с новыми техниками программирования, которые не относятся напрямую к работе с коллекциями. Это будет связано с проектом, который мы будем делать.\n\nМы поговорим о техниках:\n\n* **Lazy Evaluation** — ленивые вычисления\n* **Memoization** — мемоизация\n* **Fluent interface** — текучий интерфейс\n\nЕще мы познакомимся с понятием **DSL — Domain-specific language**. Это специализированный язык для конкретной области применения. Здесь речь не о языке программирования, хотя это тоже возможно, но с некоторыми ограничениями.\n\nDSL делится на два типа:\n\n* **Внешний**. Сюда входят языки запросов SQL и XPath, языки разметки HTML и Markdown, регулярные выражения. Они не пишутся на целевом языке, а формируются как текст, который разбирается специальными инструментами\n* **Внутренний**. Сюда входит методика создания внутренних DSL — Fluent Interface. Внутренний DSL написан на целевом языке — на котором мы программируем. Этот DSL обычно является библиотекой. Ее API выглядит как естественный язык, при этом детали реализации спрятаны\n\nDSL — важный механизм, который позволяет создавать специализированные языки. Они уменьшают вероятность появления ошибок и позволяют эффективно и быстро выражать и формировать понятия для определенной предметной области.\n\n## С каким проектом будем работать\n\nВ этом курсе мы будем делать проект, который называется Linq. Это библиотека, которая пришла из мира .NET — из языка C-sharp. Она позволяет описывать, как мы хотим обработать коллекцию и выдавать результат.\n\nСразу рассмотрим пример:\n\n```javascript\nimport HexletLinq from 'hexlet-linq';\n\nconst cars = [\n { brand: 'bmw', model: 'm5', year: 2014 },\n { brand: 'bmw', model: 'm4', year: 2013 },\n { brand: 'kia' model: 'sorento', year: 2014},\n { brand: 'kia', model: 'rio', year: 2010 },\n { brand: 'kia', model: 'sportage', year: 2012 },\n];\nconst coll = HexletLinq.from(cars);\n```\n\nЗдесь мы формируем некоторую структуру — список машин. Каждая машина представлена некоторым объектом с определенным набором данных: бренд, модель и год выпуска.\n\nПосле этого с помощью нашей библиотеки мы формируем эту коллекцию через `HexletLinq.from(cars)` — здесь происходит оборачивание или враппинг массива.\n\nУ этой коллекции есть большое количество методов, которые позволяют ее обрабатывать.\n\nНапример, мы хотим получить все модели машин, отсортированных в обратном порядке по году и принадлежащие бренду Kia:\n\n```javascript\nconst result = coll.orderBy(car => car.year, 'desc')\n .where(car => car.brand === 'kia')\n .select(car => car.model).toArray()\n\n// [ 'sorento', 'sportage', 'rio' ]\n```\n\nЧтобы выполнить эту задачу, мы пишем код так, что он читается почти как английский язык. Мы говорим, что нужно отсортировать (order by) по году выпуска (year) в обратном порядке (desc). При этом нам нужно выбрать из этих машин только те, у которых бренд Kia (where brand kia).\n\nРезультат должен представлять не коллекцию машин, а коллекцию моделей. Поэтому достаем из машин их модели (select model).\n\nДальше у нас есть специальный метод `toArray`, который преобразует список к обычному массиву, и на выходе получаем `[ 'sorento', 'sportage', 'rio' ]`. Массив содержит все модели бренда Kia, которые отсортированы по году в обратном порядке.\n\n## Почему этот курс\n\nКакие преимущества есть при изучении этого курса:\n\n* Будем писать настоящий канонический JS-код с помощью функции высших порядков. Это код, который в реальности пишут в продакшене\n* Будем обучаться через рефакторинг, а код будет эволюционировать. Значит, проект будет становиться лучше — меняться по урокам\n* Будем разрабатывать проект через тесты\n* Нужно будет думать и включаться в каждое упражнение, которое мы предоставляем\n"},"id":124,"slug":"js-collections","challenges_count":11,"name":"JS: Коллекции","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"paid","description":"На этом курсе вы изучите конкретные приемы в работе с коллекциями в языке JavaScript. Вы узнаете больше о массивах, ассоциативных массивах и множествах. В итоге вы научитесь представлять данные в виде множеств с помощью Set, использовать Map для создания словарей, создавать ленивые коллекции для уменьшения количества проходов и мемоизировать вызовы функций для оптимизации производительности. Работа с коллекциями в JavaScript пригодится, если вы решите оптимизировать производительность своего кода. Знания из этого курса помогут программистам ускорить и упростить работу с данными.","kind":"additional","updated_at":"2026-01-20T11:40:19.676Z","language":"javascript","duration_cache":48240,"skills":["Представлять данные в виде множеств с помощью Set","Использовать Map для создания словарей","Создавать ленивые коллекции для уменьшения количества проходов","Мемоизировать вызовы функций для оптимизации производительности"],"keywords":["Set","Map","текучий интерфейс","ленивые коллекции","мемоизация"],"lessons_count":11,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NjM4OSwicHVyIjoiYmxvYl9pZCJ9fQ==--d301339bc142b8588582eee69ca033648170d5c2/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--39ba06fa99226096df9fc6bb31f84e1d29ea98e9/image.png"},"recommendedLandings":[{"stack":{"id":20,"slug":"js-sicp","title":"СИКП на JS","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4050,"duration_in_months":1},"id":28,"slug":"js-sicp","title":"СИКП на JS","subtitle":"Навык понимать программы на фундаментальном уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Навык фундаментального программирования","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"js-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":false,"accessToCourseExists":false},"url":"/courses/js-collections/lessons/destructuring/theory_unit","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">JS: Коллекции</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Дестракчеринг</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Дестракчеринг","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"JS: Коллекции"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p>В функциональных языках очень популярна техника Destructuring assignment. Она слабо представлена в императивных языках, а в JavaScript вообще отсутствовала. Но после появления ES6-стандарта возможности в JavaScript по Destructuring assignment стали мощными и сравнялись с функциональными языками.</p>
<p>В этом уроке мы научим пользоваться этой техникой. Она помогает делать код более понятным, при этом позволяет писать его более компактно.</p>
<h2 id="heading-2-1">Определение Destructuring assignment</h2>
<p>Синтаксис деструктивного присваивания в JavaScript похож на синтаксис создания массива или объекта. При этом это разные операции.</p>
<p>Разберем, как обычно решаются типичные задачи в коде. Например, у нас есть массив из двух элементов. Мы хотим каждый из них присвоить своей переменой, чтобы независимо работать с ними:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const animals = ['Dog Name', 'Cat Name']
const myDog = animals[0]
const myCat = animals[1]</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Показанный здесь подход является предпочтительным. Но это можно сделать еще проще, если использовать разрешающие присваивания или просто Destructuring. Делается это так:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const animals = ['Dog Name', 'Cat Name']
const [myDog, myCat] = animals</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Слева от составного объекта, который мы хотим разложить, описывается структура. Она соответствует правой части. В ней вместо конкретных значений подставляем идентификаторы. В примере это константы <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">myDog</code> и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">myCat</code>.</p>
<p>В итоге можно увидеть, что эти структуры совпадают по внутреннему устройству. Получается, что в каждую из этих констант записывается значение на соответствующей позиции из массива правой части.</p>
<p>Как видим, Destructuring assignment помогает сократить код и сделать его более понятным. При этом индексы здесь уже не участвуют.</p>
<h2 id="heading-2-2">Rest</h2>
<p>Мы можем использовать rest-оператор:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const x = [1, 2, 3, 4, 5]
const [y, z] = x
console.log(y) // 1
console.log(z) // 2</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В итоге в <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">y</code> попадает первый элемент, в <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">z</code> — второй элемент. Остальные элементы остаются в исходном массиве и не задействованы в присваивании. Но это можно поменять и использовать rest-operator — операцию rest. Она соберет все оставшиеся элементы в массив, который мы потом можем воспользоваться:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const x = [1, 2, 3, 4, 5]
const [y, z, ...rest] = [1, 2, 3, 4, 5]
console.log(y) // 1
console.log(z) // 2
console.log(rest) // [3, 4, 5]</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Rest может использоваться не только в определении функций, но и в Destructuring. При этом он используется в самом конце, и его нельзя поставить в середине. Такой же механизм работает и с объектами.</p>
<h2 id="heading-2-3">Объекты</h2>
<p>Рассмотрим пример, как раскладывается объект:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const { a, b } = { a: 1, b: 2 }
console.log(a) // 1
console.log(b) // 2</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Слева мы указываем только идентификаторы, которые должны совпадать с именем ключа в правой части. Туда записывается соответствующее значение по ключу с таким же именем.</p>
<h2 id="heading-2-4">Значения по умолчанию</h2>
<p>Еще Destructuring assignment позволяет указывать значения по умолчанию. Например:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const [a = 5, b = 7] = [1]
console.log(a) // 1
console.log(b) // 7</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>В левой части у нас два элемента, в правой части — один элемент. При присваивании ошибки не происходят. В <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">a</code> записывается единица, а в <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">b</code> записывается семь, потому что это значение по умолчанию.</p>
<h2 id="heading-2-5">Обмен переменных местами</h2>
<p>Рассмотрим пример, который есть почти во всех языках — это обмен переменных местами без использования третьей переменной. В JavaScript это делается так:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">let a = 1
let b = 3;
[a, b] = [b, a]
console.log(a) // 3
console.log(b) // 1</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<h2 id="heading-2-6">Возврат функций</h2>
<p>Ту же технику можно использовать при вызове функций, которые возвращают составные объекты. В нашем случае это массив:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const f = () => [1, 2]
const [a, b] = f()
console.log(a) // 1
console.log(b) // 2</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Это не отличается от просто использования массива. Это означает, что Destructuring assignment работает независимо от того, откуда идут данные. Получается, нам неважен источник этих данных. Это просто использование литерала. Главное, что мы слева, описав его структуру, можем разложить его на составляющие.</p>
<p>Это важно, так как открывает много возможностей в использовании Destructuring assignment в разных местах программы. Например, в определении функций.</p>
<h2 id="heading-2-7">Определение функций</h2>
<p>Допустим, у нас есть массив животных — <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">cat</code> и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">dog</code>:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const animals = [
{ age: 5, type: 'cat' },
{ age: 10, type: 'dog' },
]
const result = animals.filter(({ age }) => age > 7)
// [ { age: 10, type: 'dog' } ]
console.log(result)</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Здесь мы как раз делаем Destructuring assignment. Вместо того, чтобы записывать объект и обращаться к его свойству <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">age</code>, мы напрямую в параметрах функции делаем разложение объекта. Получается, мы извлекаем <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">age</code> сразу из объекта, а остальную часть игнорируем.</p>
<p>Это можно делать не только в лямбда-функциях и в функциях высшего порядка. В любом определении функции можно сразу делать разложение, что является удобным механизмом.</p>
<h2 id="heading-2-8">Составной объект</h2>
<p>Еще Destructuring assignment в JavaScript позволяет раскладывать составные объекты, что делает его мощным механизмом. Рассмотрим пример:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const metadata = {
title: 'Scratchpad',
translations: [
{ locale: 'de', title: 'JavaScript-Umgebung' },
],
url: '/en-US/docs/Tools/Scratchpad',
}</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Здесь у нас есть <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">metadata</code> — составной объект, который внутри содержит массив. А этот массив содержит объекты. И с помощью Destructuring assignment мы можем его разложить на элементы:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code">const {
title: englishTitle,
translations: [{ title: localeTitle }],
} = metadata
console.log(englishTitle) // "Scratchpad"
console.log(localeTitle) // "JavaScript-Umgebung"</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Здесь мы слева описываем структуру, в которой говорим, что <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">title</code> — это <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">englishTitle</code>. Получается, мы делаем переименование — говорим, что по ключу <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">title</code> значение нужно записать в переменную с именем <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">englishTitle</code>. В нашем случае это константа.</p>
<p>Также мы раскладываем <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">translations</code> и описываем, что происходит внутри. В итоге внутренний <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">title</code> мы записываем в <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">localTitle</code>.</p>
<p>Получается, что мы описали структуру, подобную верхней, и переименовали <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">title</code>, чтобы они не пересекались. Далее мы их распечатаем, и в итоге появляются соответствующие значения из исходного составного объекта.</p>
<h2 id="heading-2-9">Выводы</h2>
<p>В этом уроке мы научились пользоваться техникой Destructuring assignment. Она помогает делать код более понятным, при этом позволяет писать его более компактно.</p>
<p>Плюсов у Destructuring assignment много: код становится чище, меньше и компактнее. При этом в отличие от других подходов, которые позволяют писать более компактный код, Destructuring assignment еще и улучшает его читаемость.</p>
<p>Этой техникой можно пользоваться и в других языках. Она есть практически везде, и позволяет писать код в более приятном стиле.</p></div><div style="margin-block:var(--mantine-spacing-xl)" class=""><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md)" class="m_8a5d1357 mantine-Title-root" data-order="2">Рекомендуемые программы</h2><style data-mantine-styles="inline">.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_2mremqrdub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/js-sicp?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на JS</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык фундаментального программирования</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MCwicHVyIjoiYmxvYl9pZCJ9fQ==--9348098e4053d798b6f34bee4ef66947540261e4/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Low%20code%20development-rafiki.png" alt="СИКП на JS" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/js-collections/lessons/destructuring/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 11</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/js-collections/lessons/destructuring/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-CdBlNCiQ.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>