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

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

前往频道在 Telegram

📈 Telegram 频道 Frontend | Вопросы собесов 的分析概览

频道 Frontend | Вопросы собесов (@easy_javascript_ru) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 18 301 名订阅者,在 技术与应用 类别中位列第 7 338,并在 俄罗斯 地区排名第 36 921

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 18 301 名订阅者。

根据 11 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -116,过去 24 小时变化为 -4,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 9.58%。内容发布后 24 小时内通常能获得 5.76% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 1 754 次浏览,首日通常累积 1 054 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 9
  • 主题关注点: 内容集中在 ставь, браузер, html, border, flex 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
Сайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Задачи t.me/+_tcX2w2EmvdmMTgy Вакансии t.me/+CgCAzIyGHHg0Nzky

凭借高频更新(最新数据采集于 12 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

18 301
订阅者
-424 小时
-497
-11630
帖子存档
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в T
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram @jobs_js_fronted для фронтов @jobs_js_back для бека Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.

🤔 Расскажи про memo в react React.memo — это функция в React, которая используется для оптимизации производительности функциональных компонентов. Она предотвращает ненужные повторные рендеры, если пропсы компонента не изменились. 🚩Зачем нужен `React.memo`? В React каждый раз, когда родительский компонент обновляется, все его дочерние компоненты тоже ререндерятся, даже если их пропсы остались неизменными. Это может негативно сказаться на производительности, особенно если дочерний компонент выполняет сложные вычисления или рендерит большое количество данных. React.memo решает эту проблему, запоминая (мемоизируя) предыдущий результат рендера и сравнивая его с новыми пропсами. Если пропсы не изменились, компонент просто использует закэшированное представление, а не ререндерится. 🚩Как использовать `React.memo`? React.memo — это функция высшего порядка (HOC), которая оборачивает функциональный компонент
import React from "react";

const MyComponent = ({ value }) => {
  console.log("Рендер компонента!");
  return <div>Значение: {value}</div>;
};

// Оборачиваем компонент в React.memo
const MemoizedComponent = React.memo(MyComponent);

export default MemoizedComponent;
🚩Пример без React.memo vs. с React.memo Допустим, у нас есть родительский компонент, который изменяет состояние при каждом клике
import React, { useState } from "react";
import MemoizedComponent from "./MyComponent";

const Parent = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Увеличить</button>
      <MemoizedComponent value="Привет, мир!" />
    </div>
  );
};

export default Parent;
🚩Когда НЕ стоит использовать `React.memo`? Если компонент всегда ререндерится из-за изменения пропсов – смысла в memo нет. Если компонент рендерится быстро – оптимизация может быть ненужной, а проверка пропсов даже замедлит работу. Если пропсы часто изменяются – кэширование теряет смысл, так как все равно ререндерится. Ставь 👍 и забирай 📚 Базу знаний

Бизнес 2026 — готовьтесь заранее Масштабная конференция про главные изменения для бизнеса в 2026 г. Налоговая реформа, продажи, прибыль, команда и партнёрство: практические идеи от экспертов Битрикс24, Точка Банк, Bidzaar и Smartway. Участвуйте бесплатно — узнайте, что важно уже сейчас ✅ Зарегистрироваться #реклама 16+ business2026.ru О рекламодателе

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

🤔 Основные причины отказа от классовых компонентов в react? С появлением React Hooks в версии 16.8 (2019 год) классовые компоненты стали устаревшим способом создания компонентов. Сегодня функциональные компоненты с хуками заменяют классы. Давайте разберем почему. 🟠Меньше кода → чище и понятнее Функциональные компоненты короче, читаются легче, а код становится чище.
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <button onClick={this.increment}>
        Счетчик: {this.state.count}
      </button>
    );
  }
}
Функциональный компонент (хуки делают код проще)
function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Счетчик: {count}
    </button>
  );
}
🟠Легче управлять жизненным циклом (useEffect vs componentDidMount) В классах жизненный цикл* компонента состоит из нескольких методов (componentDidMount, componentDidUpdate, componentWillUnmount).
class Timer extends React.Component {
  constructor(props) {
    super(props);
    this.state = { time: 0 };
  }

  componentDidMount() {
    this.timer = setInterval(() => {
      this.setState({ time: this.state.time + 1 });
    }, 1000);
  }

  componentWillUnmount() {
    clearInterval(this.timer);
  }

  render() {
    return <p>Время: {this.state.time} секунд</p>;
  }
}
Функциональный компонент (хуки делают все проще)
function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => setTime(t => t + 1), 1000);
    return () => clearInterval(timer);
  }, []);

  return <p>Время: {time} секунд</p>;
}
🟠Лучшая производительность (меньше потребления памяти) Классовые компоненты используют экземпляры классов, а функциональные компоненты – просто функции. Создают экземпляры this Обрабатывают setState Хранят лишние связи и контексты Не создают this Используют только нужные данные Оптимизируются через React.memo
const Button = React.memo(({ onClick }) => {
  console.log("Ререндер кнопки");
  return <button onClick={onClick}>Нажми</button>;
});

function App() {
  const [count, setCount] = useState(0);
  const increment = useCallback(() => setCount(c => c + 1), []);

  return (
    <div>
      <p>Счетчик: {count}</p>
      <Button onClick={increment} />
    </div>
  );
}
🟠Легче переиспользовать логику (React Hooks vs HOC/Render Props) Раньше в классах код переиспользовали через HOC и Render Props, но это делало код сложным.
function withLogging(WrappedComponent) {
  return class extends React.Component {
    componentDidMount() {
      console.log("Компонент монтирован");
    }
    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
}
Хуки (useEffect) делают код чище
function useLogger() {
  useEffect(() => console.log("Компонент монтирован"), []);
}

function MyComponent() {
  useLogger();
  return <p>Привет, мир!</p>;
}
🟠Функциональные компоненты – будущее React React официально рекомендует использовать функциональные компоненты Dan Abramov (разработчик React) Новые фичи React (Suspense, Server Components) создаются для функциональных компонентов Классы не работают в React Server Components Большинство современных библиотек (Redux Toolkit, React Query) рассчитаны на хуки Ставь 👍 и забирай 📚 Базу знаний

Где вести задачи и проекты? Конечно, в Битрикс24 Бесплатный онлайн-сервис для бизнеса и совместной работы. Полный комплект дл
Где вести задачи и проекты? Конечно, в Битрикс24 Бесплатный онлайн-сервис для бизнеса и совместной работы. Полный комплект для работы без хаоса. Ставьте первую задачу прямо сейчас Начать #реклама 16+ task-24.bitrix24.ru О рекламодателе

🤔 Является ли Web Workers частью спецификации HTML5? Да, Web Workers — часть HTML5. Это механизм для многопоточности в браузере: выполнение кода в фоновом потоке, без блокировки UI. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

В бигтехе есть место не только для разработчиков В VK ценят каждого специалиста — от маркетологов до HR. По ссылке — истории сотрудников, которые меняют продукты компании без единой строчки кода. Смотрите ролики и вакансии, где вы точно сможете проявить себя. Перейти на сайт #реклама 16+ vkteam.ru О рекламодателе

🤔 Какие есть проблемы у di? Dependency Injection (DI) — это паттерн, который упрощает управление зависимостями, но у него есть свои сложности и недостатки. 🟠Усложнение кода и архитектуры При использовании DI код может стать излишне сложным, особенно если внедрение зависимостей реализуется вручную или через сложные контейнеры.
class Service {
  constructor(repository) {
    this.repository = repository;
  }
}
🟠Производительность (затраты на создание объектов) Если DI используется через контейнеры, они могут замедлять выполнение программы, так как: Создание объектов может занимать больше времени (особенно при ленивой инициализации). Поиск зависимостей в контейнере тоже требует времени. В Angular, NestJS и других фреймворках DI может потреблять больше ресурсов, чем обычное создание объектов. 🟠Скрытая сложность и магия Когда зависимости внедряются автоматически через контейнер, код становится менее очевидным.
@Injectable()
class Service {
  constructor(private readonly repository: Repository) {}
}
🟠Проблемы с тестированием Хотя DI часто называют удобным для тестирования, на практике могут возникнуть сложности: Если контейнер создаёт объекты динамически, тесты могут работать нестабильно. Нужно явно мокать зависимости, что может усложнять настройку тестов.
class Service {
  constructor(repository) {
    this.repository = repository;
  }
}

const service = new Service(new Repository()); // Проблема при тестировании – жестко задана зависимость
Здесь тестировать Service сложно, потому что Repository создаётся вручную. Приходится использовать мок-объекты
const mockRepository = { getData: () => "mock data" };
const service = new Service(mockRepository);
🟠DI не всегда нужен В маленьких проектах использование DI может быть излишним. Простое создание объектов может быть проще и понятнее, чем настройка DI-контейнера.
const repository = new Repository();
const service = new Service(repository);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что известно про memo в React? React.memo — это HOC (Higher-Order Component), который позволяет избежать лишнего рендера, если пропсы не изменились. React.memo сравнивает предыдущие и новые пропсы (shallow comparison) и перерисовывает компонент только при их изменении. Можно передать кастомную функцию сравнения как второй аргумент для тонкой настройки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

📺 База 1000+ реальных собеседований На программиста, тестировщика, аналитика, проджекта и другие IT профы. Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д. 🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!

🤔 Для чего скрипт подключают в концe body? Основная причина – ускорение загрузки страницы и избежание блокировки рендеринга. Когда браузер загружает HTML, он читает код сверху вниз. Если в <head> встречается <script>, браузер останавливает разбор HTML, загружает и выполняет скрипт, а только потом продолжает загружать страницу. 🟠Проблема: блокировка рендеринга Если скрипт загружается в <head>, он останавливает отрисовку страницы до завершения загрузки.
<head>
  <script src="script.js"></script> <!-- ❌ Плохо: блокирует рендеринг -->
</head>
<body>
  <h1>Сайт загружается...</h1>
</body>
🟠Решение: подключение в конце `<body>` Если разместить <script> перед закрывающим </body>, сначала загружается контент страницы, а потом выполняется JavaScript.
<body>
  <h1>Контент загрузился!</h1>
  <script src="script.js"></script> <!-- Хорошо: не блокирует рендеринг -->
</body>
🟠Альтернативы: `defer` и `async` defer – отложенное выполнение после загрузки HTML
<head>
  <script src="script.js" defer></script>
</head>
async – загрузка и выполнение параллельно
<head>
  <script src="script.js" async></script>
</head>
Ставь 👍 и забирай 📚 Базу знаний

Тютю-гребень или капикрыса? Побалуйте себя роскошью от Ричарда Сапогова или утепляйтесь с культовой рубашкой Инженера. Выбира
Тютю-гребень или капикрыса? Побалуйте себя роскошью от Ричарда Сапогова или утепляйтесь с культовой рубашкой Инженера. Выбирайте фаворитов из коллекции с персонажами Антона Лапенко. Перейти на сайт #реклама tbank.ru О рекламодателе

🤔 Что известно про graceful shutdown и где применяется? Graceful shutdown — это корректное завершение работы приложения: - Завершение активных соединений; - Очистка ресурсов (например, соединений с БД); - Применяется в серверных приложениях, микросервисах, особенно при развертывании и обновлении. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие используешь подходы для написания приложения которую проще поддерживать, чем делать первоначальную разработку? При разработке frontend-приложений, которые в будущем будет проще поддерживать и масштабировать, я придерживаюсь ряда ключевых подходов. 🟠Разделение ответственности (Separation of Concerns) Это значит, что код должен быть разделен по зонам ответственности. В frontend-разработке это проявляется в: Чистом разделении логики, представления и данных (например, с помощью архитектуры MVC, MVVM или FLUX). Использовании компонентов в React/Vue или шаблонов в Angular. Разделении CSS, JS и HTML, либо использовании методологий, где стили хранятся рядом с компонентом (CSS Modules, Styled Components). Вместо того, чтобы писать всю логику и разметку в одном файле:
function App() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>Count: {count}</button>;
}
Я разделяю бизнес-логику и представление
// CounterLogic.js
export function useCounter() {
  const [count, setCount] = useState(0);
  const increment = () => setCount(count + 1);
  return { count, increment };
}

// Counter.js
import { useCounter } from "./CounterLogic";
function Counter() {
  const { count, increment } = useCounter();
  return <button onClick={increment}>Count: {count}</button>;
}
🟠Компонентный подход и повторное использование кода Frontend-приложения должны строиться из переиспользуемых и изолированных компонентов. Это уменьшает дублирование кода и делает его понятным.
// Button.js (переиспользуемый компонент)
function Button({ onClick, children }) {
  return <button onClick={onClick}>{children}</button>;
}

// Counter.js (использует Button)
function Counter() {
  const [count, setCount] = useState(0);
  return <Button onClick={() => setCount(count + 1)}>Count: {count}</Button>;
}
🟠Чистый код и читаемость Код должен быть понятным не только мне, но и другим разработчикам. Понятные имена переменных и функций. Вместо xuserAge, вместо doSmth()calculateTotalPrice(). Меньше вложенности. Вместо кучи if и else, лучше использовать early return. Разбиение кода на модули. Один файл = одна зона ответственности.
function getDiscountedPrice(price, discount) {
  if (discount <= 0) return price;
  return price - price * (discount / 100);
}
🟠Состояние приложения: локальное vs глобальное В зависимости от сложности приложения нужно правильно управлять состоянием: Локальное состояние – useState (React), ref (Vue) для простых данных внутри компонента. Глобальное состояние – Redux, MobX, Zustand, Pinia, Context API – когда данные нужны многим компонентам. Серверное состояние – React Query, SWR – когда данные приходят с API и их нужно кешировать. 🟠Следование принципам SOLID и DRY DRY (Don't Repeat Yourself) – не повторяем код, используем функции, хуки, компоненты. SOLID – например, принцип единственной ответственности (Single Responsibility Principle) гласит, что каждый компонент или функция должны решать только одну задачу.
function sendEmailAndSaveToDB(user) {
  sendEmail(user.email);
  saveUserToDatabase(user);
}
Лучше разделить логику
function sendEmail(email) { /* отправка письма */ }
function saveUserToDatabase(user) { /* сохранение в БД */ }
function registerUser(user) {
  sendEmail(user.email);
  saveUserToDatabase(user);
}
🟠Использование TypeScript TypeScript помогает избежать ошибок и делать код предсказуемым.
type User = {
  id: number;
  name: string;
};

function getUserName(user: User): string {
  return user.name;
}
🟠Документация и кодстайл ESLint + Prettier → автоформатирование и проверка стиля. JSDoc/TypeScript → документация функций и типов данных. Storybook → для документирования UI-компонентов. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как использовать селектор? Селектор в CSS используется для выбора элементов по тегу, классу, ID или атрибуту. В JS селекторы используются через document.querySelector() или useRef в React. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем различие методов call apply bind? Методы call, apply и bind принадлежат к функциональному объекту Function и используются для указания контекста this при вызове функции. Хотя все три метода позволяют контролировать значение this внутри функции, между ними существуют ключевые различия в способе использования и поведении. 🚩Сall Вызывает функцию, явно устанавливая this в первом аргументе. Остальные аргументы передаются в вызываемую функцию как есть.
function greet(message, name) {
  console.log(${message}, ${name}. This is ${this});
}

greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"
🚩Apply Очень похож на call, но принимает аргументы в виде массива, а не по отдельности.
function greet(message, name) {
  console.log(
${message}, ${name}. This is ${this}
);
}

greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"
🚩Bind Создаёт новую функцию, которая, когда она вызывается, имеет установленный контекст this, указанный в первом аргументе. В отличие от call и apply, bind не вызывает функцию сразу, а возвращает новую функцию, которую можно вызвать позже.
function greet(message, name) {
  console.log(
${message}, ${name}. This is ${this}
);
}

const greetEarth = greet.bind("Earth", "Hello", "Alice");
greetEarth(); // "Hello, Alice. This is Earth"
Ставь 👍 и забирай 📚 Базу знаний

Видовые квартиры в Ялте с собственным пляжем ЖК "Юсуповский" — ваша личная резиденция бизнес-класса на берегу моря! Здесь каж
Видовые квартиры в Ялте с собственным пляжем ЖК "Юсуповский" — ваша личная резиденция бизнес-класса на берегу моря! Здесь каждый элемент говорит о статусе: от величественного фасада до 2-этажного SPA и фитнес-центра на территории. ✅ Панорамное остекление ✅ Открытый подогреваемый бассейн и закрытый двор-парк 2 га ✅ 2-этажные квартиры ✅ Трансфер к пляжу ✅ Реликтовый парк и водопад на территории. Всего в нескольких минутах езды: Ливадийский дворец, Солнечная тропа, ведущая вдоль побережья, а также лучшие рестораны и культурные, развлекательные объекты Ялты. Это инвестиция в будущее: Ваш второй дом и источник вдохновения для будущих поколений. До 30 ноября 2025 года вы можете купить квартиры в рассрочку 0%. Не упустите эту возможность! Купить Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО СЗ ВОЛГА. Финансовые услуги оказывает: ПАО "Сбербанк". #реклама gk-yusupovskiy.ru О рекламодателе

🤔 Как делать HTML-форму? HTML-форма создается с помощью тега <form>, внутри которого размещаются элементы управления: <input>, <select>, <textarea>, <button>. Атрибуты action и method указывают, куда и каким способом отправлять данные. Например, <form method="post" action="/submit">. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как растянуть элемент на 100%? Чтобы растянуть элемент на 100% (по ширине, высоте или обоим направлениям), нужно понимать контекст, от чего "100%" будет вычисляться. Значение 100% в CSS основывается на родительском элементе. Рассмотрим различные случаи и подходы. 🟠Растяжение элемента на 100% ширины (`width: 100%;`) Элемент займет всю ширину своего родителя.
<div style="width: 300px; background: lightblue;">
  <div style="width: 100%; background: coral;">Я растянут по ширине!</div>
</div>
🟠Растяжение элемента на 100% высоты (`height: 100%;`) Элемент займет всю высоту родительского элемента.
<div style="height: 300px; background: lightblue;">
  <div style="height: 100%; background: coral;">Я растянут по высоте!</div>
</div>
🟠Растяжение элемента на 100% ширины и высоты Для растяжения элемента как по ширине, так и по высоте относительно родителя используются width: 100%; и height: 100%;.
<div style="width: 300px; height: 300px; background: lightblue;">
  <div style="width: 100%; height: 100%; background: coral;">Растянут по ширине и высоте!</div>
</div>
🟠Растяжение относительно окна браузера (`viewport`) Если элемент нужно растянуть на весь экран, используются единицы 100vw (ширина окна) и 100vh (высота окна).
<div style="width: 100vw; height: 100vh; background: coral;">
  Я растянут на весь экран!
</div>
Для исключения полосы прокрутки можно использовать
width: calc(100vw - 16px); /* Учитывается ширина скролла */
🟠Использование `position: absolute` Когда нужно растянуть элемент независимо от размера его содержимого, можно использовать position: absolute.
<div style="position: relative; width: 300px; height: 300px; background: lightblue;">
  <div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: coral;">
    Я растянут абсолютно!
  </div>
</div>
🟠Растяжение внутри Flexbox-контейнера Flexbox автоматически растягивает вложенные элементы, если у них указаны свойства flex: 1 или align-items: stretch.
<div style="display: flex; width: 300px; height: 300px; background: lightblue;">
  <div style="flex: 1; background: coral;">Я растянут по Flexbox!</div>
</div>
🟠Растяжение внутри Grid-контейнера CSS Grid также позволяет растягивать элементы.
<div style="display: grid; width: 300px; height: 300px; background: lightblue;">
  <div style="width: 100%; height: 100%; background: coral;">Я растянут внутри Grid!</div>
</div>
🟠Растяжение с учетом отступов Если нужно учесть отступы (padding) или границы (border), используйте свойство box-sizing: border-box. Это гарантирует, что элемент с width: 100% и height: 100% не будет "выходить за пределы" из-за отступов.
<div style="width: 300px; height: 300px; background: lightblue;">
  <div style="width: 100%; height: 100%; padding: 20px; box-sizing: border-box; background: coral;">
    Я растянут с учетом отступов!
  </div>
</div>
Ставь 👍 и забирай 📚 Базу знаний