en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

Frontend | Вопросы собесов

Frontend | Вопросы собесов

Open in Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Show more

📈 Analytical overview of Telegram channel Frontend | Вопросы собесов

Channel Frontend | Вопросы собесов (@easy_javascript_ru) in the Russian language segment is an active participant. Currently, the community unites 17 326 subscribers, ranking 7 465 in the Technologies & Applications category and 37 811 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 17 326 subscribers.

According to the latest data from 05 November, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -286 over the last 30 days and by -4 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 6.64%. Within the first 24 hours after publication, content typically collects 4.45% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 1 152 views. Within the first day, a publication typically gains 771 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
  • Thematic interests: Content is focused on key topics such as ставь, браузер, html, border, flex.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Thanks to the high frequency of updates (latest data received on 06 November, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

17 326
Subscribers
-424 hours
-967 days
-28630 days
Posts Archive
\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-12-29T09:10:13Z","dateModified":"2024-12-29T09:10:13Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3559},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":11},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":25}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/996","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/996","mainEntityOfPage":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/996","headline":"🤔 Зачем нам нужен менеджер состояния? Менеджер состояния используется для централизованного управления данным…","articleBody":"🤔 Зачем нам нужен менеджер состояния?\n\nМенеджер состояния используется для централизованного управления данными в приложении. Это упрощает обмен данными между компонентами, делает состояние приложения предсказуемым и упрощает отладку. Например, Vuex или Redux помогают управлять состоянием в сложных приложениях.\n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚 Базу знаний","datePublished":"2024-12-28T16:10:10Z","dateModified":"2024-12-28T16:10:10Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3424},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":15},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}}]}
🤔 Из чего строится размер элемента? Размер элемента состоит из содержимого, внутренних отступов (padding), границ (border) и внешних отступов (margin). Суммарный размер зависит от используемой модели box-sizing. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как пользовался линтер js? Это инструменты, которые помогают разработчикам находить и устранять ошибки, улучшать стиль кода и обеспечивать соответствие кода определенным стандартам. Самый популярный линтер для JavaScript — это ESLint. 🚩Установка ESLint 1⃣Установка Node.js и npm Убедитесь, что у вас установлены Node.js и npm (Node Package Manager). Их можно скачать и установить с [официального сайта Node.js]. 2⃣Инициализация проекта Если у вас еще нет проекта, создайте новый с помощью команды:
npm init -y   
3⃣Установка ESLint Установите ESLint как dev-зависимость
npm install eslint --save-dev   
🚩Настройка ESLint 🟠Инициализация конфигурации ESLint Запустите команду для создания файла конфигурации .eslintrc:
npx eslint --init   
🚩Использование ESLint 🟠Линтинг кода Чтобы проверить ваш код с помощью ESLint, используйте команду
npx eslint имя_файла.js   
Например, если у вас есть файл app.js, выполните
npx eslint app.js   
🟠Автоматическое исправление ошибок ESLint может автоматически исправлять некоторые типы ошибок. Используйте флаг --fix, чтобы исправить ошибки, которые можно исправить автоматически:
npx eslint имя_файла.js --fix   
🟠Линтинг всего проекта Вы можете линтить все файлы в проекте, добавив скрипт в package.json. Откройте package.json и добавьте следующий скрипт в раздел "scripts":
"scripts": {
    "lint": "eslint ."
}  
Теперь вы можете запускать линтер для всего проекта с помощью команды
npm run lint
🚩Пример конфигурации .eslintrc.json Приведем пример базовой конфигурации для проекта, не использующего фреймворки
{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": "eslint:recommended",
    "parserOptions": {
        "ecmaVersion": 12,
        "sourceType": "module"
    },
    "rules": {
        "indent": ["error", 4],
        "linebreak-style": ["error", "unix"],
        "quotes": ["error", "single"],
        "semi": ["error", "always"]
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего служат vh и vw при указании размеров? vh и vw задают размеры элементов в процентах от высоты и ширины окна браузера соответственно. Они позволяют адаптировать элементы к размеру экрана. Используются для создания масштабируемого дизайна. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как обратиться к дом-дереву в реакте? В React обращаться к DOM-дереву можно несколькими способами, в зависимости от задач. Основные подходы включают использование рефов (refs) и манипуляции с элементами через стандартные методы JavaScript. 🟠Использование рефов (Refs) Рефы позволяют получить доступ к DOM-элементам напрямую. Это особенно полезно для управления фокусом, проигрывания медиа или интеграции с библиотеками сторонних разработчиков.
import React, { Component } from 'react';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }

  componentDidMount() {
    // Получаем доступ к DOM-элементу через реф
    this.myRef.current.focus();
  }

  render() {
    return <input type="text" ref={this.myRef} />;
  }
}

export default MyComponent;
Пример с использованием функционального компонента и хуков
import React, { useRef, useEffect } from 'react';

const MyComponent = () => {
  const myRef = useRef(null);

  useEffect(() => {
    // Получаем доступ к DOM-элементу через реф
    myRef.current.focus();
  }, []);

  return <input type="text" ref={myRef} />;
};

export default MyComponent;
🟠Манипуляции через стандартные методы JavaScript Иногда нужно обращаться к DOM-элементам, используя стандартные методы, такие как document.getElementById или document.querySelector. Это не рекомендуется, так как это противоречит философии React по работе с виртуальным DOM, но может быть полезно в некоторых случаях.
import React, { useEffect } from 'react';

const MyComponent = () => {
  useEffect(() => {
    const element = document.getElementById('my-element');
    element.style.color = 'red';
  }, []);

  return <div id="my-element">Hello, world!</div>;
};

export default MyComponent;
🟠Манипуляции через хуки React предлагает несколько хуков, которые могут быть использованы для управления жизненным циклом компонентов и обращения к DOM-элементам. useEffect: Хук для выполнения побочных эффектов. useLayoutEffect: Похож на useEffect, но выполняется синхронно после всех изменений DOM.
import React, { useRef, useLayoutEffect } from 'react';

const MyComponent = () => {
  const myRef = useRef(null);

  useLayoutEffect(() => {
    // Получаем доступ к DOM-элементу через реф
    myRef.current.style.color = 'blue';
  }, []);

  return <div ref={myRef}>Hello, world!</div>;
};

export default MyComponent;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое адаптивная верстка? Адаптивная верстка обеспечивает корректное отображение веб-страниц на экранах разных размеров, включая мобильные устройства и компьютеры. Используются медиа-запросы и гибкие единицы измерения для настройки элементов в зависимости от ширины экрана. Цель — создать удобный и функциональный интерфейс на всех устройствах. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что если микрозадача создаст еще микрозадачу? Когда микрозадача (microtask) создаёт другую микрозадачу, обе задачи будут выполнены в том же цикле событий (event loop), прежде чем будет обработано следующее макрозадача (macrotask). 🚩Как работает цикл событий 🟠Макрозадачи (macrotasks) Например, обработчики событий, setTimeout, setInterval. 🟠Микрозадачи (microtasks) Например, Promises, MutationObserver, process.nextTick (в Node.js). 🚩Последовательность выполнения 1⃣Выполняется макрозадача. 2⃣Обрабатываются все микрозадачи, пока очередь микрозадач не станет пустой. 3⃣Переход к следующей макрозадаче.
console.log('Start');

setTimeout(() => {
  console.log('Macrotask: setTimeout');
}, 0);

Promise.resolve()
  .then(() => {
    console.log('Microtask 1');
    Promise.resolve().then(() => {
      console.log('Microtask 2');
    });
  })
  .then(() => {
    console.log('Microtask 3');
  });

console.log('End');
🚩Ожидаемый результат console.log('Start') Выполняется сразу. console.log('End') Выполняется сразу после первого console.log. Очередь макрозадач ставит функцию из setTimeout. Очередь микрозадач добавляет первую микрозадачу из Promise.resolve().then(...). Вывод в консоли
Start
End
Microtask 1
Microtask 2
Microtask 3
Macrotask: setTimeout
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие проблемы решает React? React упрощает создание динамических интерфейсов, управляя состоянием и обновлением DOM через Virtual DOM. Он решает проблему сложного взаимодействия между компонентами, предоставляя декларативный подход. React также улучшает производительность благодаря оптимизированным обновлениям и повторному использованию компонентов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чего стоит и не стоит избегать в оптимизации сайта? 🟠Оптимизация изображений Сжатие без потери качества: Используйте инструменты, такие как TinyPNG или ImageOptim. Использование современных форматов: WebP и AVIF обеспечивают лучшее сжатие и качество. Lazy Loading: Загружайте изображения по мере их появления в области видимости пользователя. 🟠Минификация и объединение файлов Минификация: Уменьшайте размеры CSS, JavaScript и HTML-файлов с помощью инструментов, таких как UglifyJS и CSSNano. Объединение: Сокращайте количество HTTP-запросов, объединяя несколько файлов в один. 🟠Использование CDN (Content Delivery Network) Размещайте копии вашего сайта на серверах по всему миру, чтобы уменьшить задержки для пользователей из разных регионов. 🟠Кэширование На стороне клиента: Настройте заголовки кэширования HTTP. На стороне сервера: Используйте технологии, такие как Varnish или Nginx. 🟠Асинхронная загрузка и критический CSS Асинхронная загрузка: Используйте атрибуты async и defer для JavaScript. Критический CSS: Встраивайте важные стили прямо в HTML, чтобы ускорить начальную отрисовку страницы. 🟠Улучшение производительности сервера Сжатие данных: Включите gzip или Brotli. HTTP/2: Переходите на HTTP/2 для мультиплексирования запросов. 🟠Использование современных технологий Service Workers: Для офлайн-работы и улучшенного кэширования. Prefetching и Preloading: Предзагрузка и предзапросы ресурсов. 🟠Мониторинг и анализ Google Lighthouse, PageSpeed Insights: Используйте для анализа производительности. Реальное время: Применяйте Google Analytics, New Relic. 🚩Чего стоит избегать при оптимизации сайта 🟠Избегайте чрезмерной минимизации Читаемость кода: Минимизация без генерации карт кода (source maps) может усложнить отладку. 🟠Не используйте большие, несжатые изображения Размер файлов: Это замедляет загрузку и увеличивает потребление трафика пользователем. 🟠Не загружайте все ресурсы сразу Асинхронная загрузка: Используйте техники lazy loading и асинхронной загрузки. 🟠Не пренебрегайте кэшированием Отсутствие кэширования: Увеличивает время загрузки для повторных посещений. 🟠Избегайте блокирующих ресурсов JavaScript и CSS: Не блокируйте рендеринг страницы тяжелыми файлами. 🟠Не злоупотребляйте анимациями и большими скриптами Производительность: Сложные анимации и большие скрипты могут замедлить сайт, особенно на мобильных устройствах. 🟠Избегайте чрезмерного использования плагинов Нагрузки: Избыток плагинов может значительно замедлить сайт и создать проблемы с безопасностью. 🟠Не забывайте про оптимизацию для мобильных устройств Мобильная версия: Сайт должен быть оптимизирован для мобильных пользователей, так как большинство пользователей используют мобильные устройства. Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем используют Vuex? Используется для управления состоянием в приложениях на Vue.js. Он обеспечивает централизованное хранилище, позволяя всем компонентам обращаться к единому источнику данных. Это упрощает работу с состоянием, делает логику приложения предсказуемой и улучшает структуру кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Сколько есть способов что-то сделать асинхронно? В JavaScript существует несколько способов выполнения асинхронных операций. Основные из них включают коллбеки (callbacks), промисы (promises) и async/await. 🟠Коллбеки (Callbacks) Коллбеки были первым способом выполнения асинхронных операций в JavaScript. Это функции, которые передаются другим функциям в качестве аргументов и вызываются после завершения асинхронной операции.
function fetchData(callback) {
  setTimeout(() => {
    const data = "some data";
    callback(data);
  }, 1000);
}

fetchData((result) => {
  console.log(result);
});
Почему это нужно: Коллбеки позволяют выполнять код после завершения асинхронной задачи, например, загрузки данных с сервера. Как используется: Передаем функцию в качестве аргумента и вызываем её, когда данные готовы. Почему так: Это простой способ передать управление после завершения асинхронной операции, но может привести к "аду коллбеков" (callback hell) при множественных вложенных вызовах. 🟠Промисы (Promises) Промисы были введены для упрощения работы с асинхронным кодом и для решения проблемы вложенности, характерной для коллбеков. Промис представляет собой объект, который может находиться в одном из трёх состояний: ожидание (pending), выполнено (fulfilled) или отклонено (rejected).
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = "some data";
      resolve(data);
    }, 1000);
  });
}

fetchData().then((result) => {
  console.log(result);
}).catch((error) => {
  console.error(error);
});
Почему это нужно: Промисы делают код более читаемым и управляемым, особенно при наличии цепочек асинхронных операций. Как используется: Создаем новый промис и возвращаем его из функции. Затем используем методы then и catch для обработки результата или ошибки. Почему так: Промисы позволяют избежать вложенности и обеспечивают более линейный и понятный поток выполнения. 🟠async/await Это синтаксический сахар поверх промисов, который делает код ещё более читаемым и похожим на синхронный.
async function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      const data = "some data";
      resolve(data);
    }, 1000);
  });
}

async function main() {
  try {
    const result = await fetchData();
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

main();
Почему это нужно: async/await упрощает написание и чтение асинхронного кода, устраняя необходимость использования методов then и catch. Как используется: Объявляем функцию с ключевым словом async и используем await для ожидания завершения промиса. Почему так: async/await делает асинхронный код более похожим на синхронный, улучшая его читаемость и поддержку. Ставь 👍 и забирай 📚 Базу знаний

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

🤔 Что такое async/await? Это синтаксис для работы с асинхронными операциями в JavaScript, который упрощает управление промисами. Ключевое слово async делает функцию асинхронной, а await приостанавливает её выполнение до завершения промиса. Это позволяет писать асинхронный код, похожий на синхронный. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как значения box-size влияют на размер элемента? Значения свойства box-sizing в CSS определяют, как учитываются отступы (padding) и рамки (border) при расчете размера элемента (width и height). Это влияет на окончательные размеры и внешний вид элемента на странице. 🚩Значение content-box Это значение по умолчанию для всех элементов. Когда вы устанавливаете размеры элемента с box-sizing: content-box, ширина и высота элемента включают только содержимое (content), но не включают отступы и рамки.
.element {
    box-sizing: content-box; /* значение по умолчанию */
    width: 200px;
    padding: 20px;
    border: 10px solid black;
}
🚩Расчет размера 🟠Ширина 200px (содержимое) + 20px (отступ слева) + 20px (отступ справа) + 10px (рамка слева) + 10px (рамка справа) = 260px. 🟠Высота аналогично рассчитывается с учетом отступов и рамок сверху и снизу. 🚩Значение border-box При использовании значения border-box, размеры элемента (width и height) включают содержимое, отступы и рамки. Это делает расчет размеров более простым и предсказуемым.
.element {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 10px solid black;
}
🚩Расчет размера 🟠Ширина 200px уже включает отступы и рамки, то есть фактическая ширина содержимого будет 140px (200px - 20px (отступ слева) - 20px (отступ справа) - 10px (рамка слева) - 10px (рамка справа)). 🟠Высота аналогично, высота включает отступы и рамки. 🚩Пример для сравнения HTML
<div class="content-box">Content-box</div>
<div class="border-box">Border-box</div>
CSS
div {
    margin: 10px;
    padding: 20px;
    border: 10px solid black;
}

.content-box {
    box-sizing: content-box;
    width: 200px;
    height: 100px;
}

.border-box {
    box-sizing: border-box;
    width: 200px;
    height: 100px;
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужно замыкание? Это функция, которая "захватывает" переменные из своей внешней области видимости. Это позволяет сохранять данные между вызовами функции и реализовывать приватные переменные. Например, замыкания полезны для создания функций-генераторов или скрытия внутренних данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как оптимизировать сайт? Оптимизация сайта включает в себя несколько стратегий и техник, направленных на улучшение производительности, скорости загрузки и пользовательского опыта. 🟠Оптимизация изображений Используйте инструменты для сжатия изображений (например, TinyPNG, ImageOptim) без значительной потери качества. Используйте современные форматы изображений, такие как WebP, которые обеспечивают лучшее сжатие по сравнению с JPEG и PNG. Загружайте изображения по мере их появления в области видимости пользователя (атрибут loading="lazy" в HTML). 🟠Минификация и объединение файлов Уменьшите размер CSS, JavaScript и HTML-файлов с помощью инструментов, таких как UglifyJS, CSSNano, HTMLMinifier. Сократите количество HTTP-запросов, объединив несколько CSS или JavaScript файлов в один. 🟠Использование CDN (Content Delivery Network) Храните копии вашего сайта на серверах по всему миру, чтобы уменьшить время загрузки для пользователей из разных регионов. 🟠Кэширование Настройте заголовки кэширования HTTP, чтобы браузеры могли хранить копии статических ресурсов (CSS, JavaScript, изображения). Используйте технологии, такие как Varnish или Nginx, для кэширования страниц на сервере. 🟠Оптимизация CSS и JavaScript Используйте атрибуты async и defer для асинхронной загрузки JavaScript, чтобы не блокировать рендеринг страницы. Встраивайте критические стили прямо в HTML, чтобы ускорить начальную отрисовку страницы. 🟠Улучшение производительности сервера Включите сжатие gzip или Brotli на сервере для уменьшения размера передаваемых данных. Переход на HTTP/2, который поддерживает мультиплексирование запросов, позволяет загружать несколько ресурсов одновременно через одно соединение. 🟠Использование современных технологий Используйте Service Workers для создания прогрессивных веб-приложений (PWA), обеспечивающих офлайн-работу и улучшенное кэширование. Используйте техники предзагрузки (preload) и предзапросов (prefetch) для ресурсов, которые понадобятся в ближайшее время. 🟠Мониторинг и анализ Используйте Google Lighthouse, PageSpeed Insights и WebPageTest для анализа производительности и поиска узких мест. Применяйте сервисы, такие как Google Analytics, New Relic, для отслеживания реальной производительности и пользовательского опыта.
<img src="example.jpg" loading="lazy" alt="Пример изображения">
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое контекст? Это значение ключевого слова this, которое зависит от способа вызова функции. Он определяет, к какому объекту или окружению функция относится в момент выполнения. Контекст можно изменить с помощью методов call, apply и bind. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как отследить изменение поле объекта? Чтобы отслеживать изменения свойств объекта в JavaScript, можно использовать несколько методов, каждый из которых подходит для различных случаев. 🟠Использование Proxy Proxy является мощным и гибким способом перехвата и настройки операций с объектами, включая чтение и запись свойств.
const handler = {
    get(target, property) {
        console.log(`Getting value of ${property}`);
        return target[property];
    },
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        return true;
    }
};
const person = {
    name: 'Alice',
    age: 25
};
const proxyPerson = new Proxy(person, handler);
proxyPerson.name = 'Bob'; // Setting value of name to Bob
console.log(proxyPerson.name); // Getting value of name // Bob
🟠Использование Object.defineProperty Object.defineProperty позволяет определить новое или изменить существующее свойство непосредственно на объекте, позволяя добавить геттеры и сеттеры для отслеживания изменений.
const person = {
    _name: 'Alice',
    _age: 25
};
Object.defineProperty(person, 'name', {
    get() {
        console.log('Getting name');
        return this._name;
    },
    set(value) {
        console.log(`Setting name to ${value}`);
        this._name = value;
    }
});
Object.defineProperty(person, 'age', {
    get() {
        console.log('Getting age');
        return this._age;
    },
    set(value) {
        console.log(`Setting age to ${value}`);
        this._age = value;
    }
});
person.name = 'Bob'; // Setting name to Bob
console.log(person.name); // Getting name // Bob
person.age = 30; // Setting age to 30
console.log(person.age); // Getting age // 30
🟠Использование библиотеки MobX MobX — это библиотека для управления состоянием, которая делает состояния наблюдаемыми и автоматически синхронизирует их с пользовательским интерфейсом.
import { observable, autorun } from 'mobx';
const person = observable({
    name: 'Alice',
    age: 25,
    setName(name) {
        this.name = name;
    },
    setAge(age) {
        this.age = age;
    }
});
// Автоматически вызываемая функция при изменении наблюдаемого состояния
autorun(() => {
    console.log(`Name: ${person.name}, Age: ${person.age}`);
});
person.setName('Bob'); // Name: Bob, Age: 25
person.setAge(30); // Name: Bob, Age: 30
🟠Наблюдатель на изменение (MutationObserver) Для отслеживания изменений в DOM можно использовать MutationObserver. Это не напрямую связано с объектами, но полезно для отслеживания изменений в элементах DOM.
const targetNode = document.getElementById('target');
const config = { attributes: true, childList: true, subtree: true };
const callback = function(mutationsList, observer) {
    for(let mutation of mutationsList) {
        if (mutation.type === 'childList') {
            console.log('A child node has been added or removed.');
        }
        else if (mutation.type === 'attributes') {
            console.log('The ' + mutation.attributeName + ' attribute was modified.');
        }
    }
};
const observer = new MutationObserver(callback);
observer.observe(targetNode, config);
targetNode.setAttribute('data-test', 'value');
Ставь 👍 и забирай 📚 Базу знаний

🤔 Расскажи про гибридные приложения? Гибридные приложения сочетают элементы веб-приложений (HTML, CSS, JavaScript) и платформенно-зависимые компоненты. Они развёртываются как нативные приложения, но используют встроенные браузеры для отображения веб-контента. Такие приложения легче разрабатывать, но их производительность может быть ниже, чем у нативных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Отслеживаемые свойства, что такое, как использовать? В контексте разработки приложений, отслеживаемые свойства (observable properties) относятся к свойствам объектов, изменения которых можно отслеживать. Это полезно для автоматического обновления пользовательского интерфейса или выполнения других действий при изменении данных. В JavaScript для реализации отслеживаемых свойств часто используются библиотеки, такие как MobX, или встроенные механизмы, такие как Proxy. 🚩Использование Proxy для отслеживания свойств Встроенный объект Proxy в JavaScript позволяет перехватывать и настраивать операции, выполняемые с объектом, такие как чтение и запись свойств.
const handler = {
    get(target, property) {
        console.log(`Getting value of ${property}`);
        return target[property];
    },
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        return true;
    }
};
const person = {
    name: 'Alice',
    age: 25
};
const proxyPerson = new Proxy(person, handler);
proxyPerson.name = 'Bob'; // Setting value of name to Bob
console.log(proxyPerson.name); // Getting value of name // Bob
🚩Использование MobX для отслеживания свойств Это библиотека для управления состоянием, которая делает состояния наблюдаемыми и автоматически синхронизирует их с пользовательским интерфейсом. 1⃣Установка MobX
npm install mobx mobx-react
2⃣Пример использования MobX
import { observable, autorun } from 'mobx';
import { observer } from 'mobx-react';
import React from 'react';
import ReactDOM from 'react-dom';
const appState = observable({
    count: 0,
    increment() {
        this.count++;
    }
});
autorun(() => {
    console.log(`Count: ${appState.count}`);
});
appState.increment(); // Count: 1
appState.increment(); // Count: 2
const Counter = observer(() => (
    <div>
        <p>Count: {appState.count}</p>
        <button onClick={() => appState.increment()}>Increment</button>
    </div>
));
ReactDOM.render(<Counter />, document.getElementById('root'));
🚩Плюсы отслеживаемых свойств ➕Автоматическое обновление UI Изменения данных автоматически отражаются в пользовательском интерфейсе. ➕Централизованное управление состоянием Легче управлять состоянием и следить за его изменениями. ➕Повышенная производительность При правильной настройке обновляются только те части интерфейса, которые зависят от измененных данных. 🚩Примеры реального использования Простой счетчик с использованием Proxy
const handler = {
    set(target, property, value) {
        console.log(`Setting value of ${property} to ${value}`);
        target[property] = value;
        document.getElementById(property).innerText = value;
        return true;
    }
};
const state = {
    count: 0
};
const proxyState = new Proxy(state, handler);

document.getElementById('increment').addEventListener('click', () => {
    proxyState.count++;
});
<div>
    <p id="count">0</p>
    <button id="increment">Increment</button>
</div>
<script src="path/to/your/script.js"></script>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нам нужен менеджер состояния? Менеджер состояния используется для централизованного управления данными в приложении. Это упрощает обмен данными между компонентами, делает состояние приложения предсказуемым и упрощает отладку. Например, Vuex или Redux помогают управлять состоянием в сложных приложениях. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний