Frontend | Вопросы собесов
Сайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Задачи t.me/+_tcX2w2EmvdmMTgy Вакансии t.me/+CgCAzIyGHHg0Nzky
Показати більше📈 Аналітичний огляд Telegram-каналу Frontend | Вопросы собесов
Канал Frontend | Вопросы собесов (@easy_javascript_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 265 підписників, посідаючи 7 325 місце в категорії Технології та додатки та 36 895 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 265 підписників.
За останніми даними від 19 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -128, а за останні 24 години на 1, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 9.80%. Протягом перших 24 годин після публікації контент зазвичай збирає 5.48% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 790 переглядів. Протягом першої доби публікація в середньому набирає 1 002 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 9.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, браузер, html, border, flex.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky”
Завдяки високій частоті оновлень (останні дані отримано 20 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
const [count, setCount] = useState(0);
- useEffect: Позволяет выполнять побочные эффекты в компоненте, такие как обращения к API, подписки и т.д. Это аналог методов жизненного цикла componentDidMount, componentDidUpdate, и componentWillUnmount в классовых компонентах.
useEffect(() => {
document.title = Вы нажали ${count} раз;
}, [count]); // Эффект использует переменную состояния count
- useContext: Позволяет получить доступ к данным из контекста. Это упрощает передачу данных через дерево компонентов без необходимости передавать props на каждом уровне.
const value = useContext(MyContext);
- useReducer: Предоставляет альтернативный способ управления состоянием, основанный на паттерне редьюсер. Это особенно полезно для управления сложным состоянием.
const [state, dispatch] = useReducer(reducer, initialState);
- useCallback: Возвращает мемоизированный колбэк, который изменяется только если изменяются зависимости. Это помогает предотвратить ненужные ререндеры.
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
- useMemo: Мемоизирует вычисляемое значение. Это помогает избежать ненужных вычислений при каждом рендере.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
- useRef: Возвращает изменяемый ref объект, который может быть использован для хранения значения на протяжении всего жизненного цикла компонента.
const myRef = useRef(initialValue);
Хуки были введены для решения нескольких проблем:
✅ Упрощение переиспользования логики состояния между компонентами без необходимости создавать высшие порядковые компоненты или рендер-пропсы.
✅ Использование состояния и других возможностей React без написания классов.
✅ Организация логики внутри компонента по принципу использования, а не жизненного цикла.
Хуки предлагают более простой и мощный способ создания компонентов, делая код более читабельным и легко поддерживаемым.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхprops следующим образом:
const ParentComponent = () => {
return <ChildComponent name="Иван" age={30} />;
};
В этом примере, ChildComponent получает два props: name и age. Доступ к этим props внутри ChildComponent происходит так:
const ChildComponent = (props) => {
return <h1>Привет, мое имя {props.name}, мне {props.age} лет.</h1>;
};
Особенности props
✅ Неизменяемость: Предназначены только для чтения. Это означает, что компонент не может изменить свои props, но может либо использовать их "как есть", либо использовать их для вычисления новых значений внутри компонента.
✅ Передача данных: Позволяют компонентам получать данные от родителя, что делает компоненты более гибкими и повторно используемыми.
✅ Передача функций: Через него можно передавать не только данные, но и функции, что позволяет родительскому компоненту предоставлять обработчики событий дочерним компонентам.
Пример передачи функции
const ParentComponent = () => {
const showAlert = () => {
alert("Приветствие от родителя!");
};
return <ChildComponent showAlert={showAlert} />;
};
const ChildComponent = (props) => {
return <button onClick={props.showAlert}>Показать приветствие</button>;
};
В этом примере, функция showAlert определена в ParentComponent и передается как props в ChildComponent, который затем использует ее как обработчик события клика для кнопки.
props — это механизм для передачи данных и функций от родительских компонентов к дочерним, делая компоненты гибкими и повторно используемыми. С помощью props, компоненты могут динамически отображать данные и взаимодействовать с другими компонентами в приложении.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхprototype функции-конструктора. Это означает, что новый объект наследует свойства и методы, определённые в прототипе конструктора.
3️⃣ Вызов функции-конструктора: Функция-конструктор вызывается с аргументами, переданными в неи, и контекстом this, установленным в только что созданный объект. Это позволяет добавлять свойства и методы непосредственно к экземпляру.
4️⃣ Возврат значения: Если функция-конструктор возвращает объект, то этот объект возвращается вместо только что созданного. Если возвращается не объект (например, примитивное значение) или функция-конструктор вообще ничего не возвращает, то возвращается созданный на шаге 1 объект.
Пример:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log(Привет, меня зовут ${this.name}!);
};
// Создаём новый объект с помощью new
const person1 = new Person('Алексей', 30);
person1.greet(); // Выводит: "Привет, меня зовут Алексей!"
В этом примере new Person('Алексей', 30) создаёт новый объект, прототипом которого является Person.prototype, и вызывает функцию Person с this, указывающим на новый объект, что позволяет добавить свойства name и age к этому объекту. После этого, с новым объектом можно взаимодействовать, как с экземпляром Person, включая вызов методов, определённых в Person.prototype.
new позволяет создавать новые объекты на основе функций-конструкторов или классов, автоматически устанавливая связь между созданным объектом и прототипом конструктора, что обеспечивает наследование свойств и методов.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовых{}. Это позволяет динамически управлять содержимым компонентов.
- Компонентный подход: Легко создавать и использовать повторно компоненты UI, что упрощает разработку сложных пользовательских интерфейсов.
- Преобразование: Не может быть выполнен напрямую браузерами и требует преобразования в обычный JavaScript. Это обычно делается с помощью транспиляторов, таких как Babel.
Пример:
const element = <h1>Привет, мир!</h1>;
Этот пример демонстрирует JSX-элемент, который представляет собой заголовок первого уровня с текстом "Привет, мир!". В реальном JavaScript этот код будет преобразован в вызов React.createElement(), который создаёт React-элемент.
Вставка выражений:
Вы можете вставлять любые допустимые JavaScript-выражения в него, обернув их в фигурные скобки. Например:
const name = 'Иван Иванов';
const element = <h1>Привет, {name}</h1>;
Преимущества использования JSX:
✅ Наглядность: Код с ним легче читать и писать, поскольку он напоминает HTML.
✅ Мощность: Сочетает в себе преимущества JavaScript, позволяя использовать всю его выразительную мощь при описании UI.
✅ Интеграция: Плотно интегрирован с React, облегчая создание интерактивных компонентов.
JSX — это расширение синтаксиса, которое делает разработку интерфейсов на React более интуитивной и выразительной за счёт смешивания HTML-подобного кода с JavaScript. Хотя использование JSX необязательно для работы с React, оно значительно упрощает процесс разработки и повышает читабельность кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовых[[Prototype]] (как правило, доступное как proto или через Object.getPrototypeOf()), которое ссылается на другой объект — его прототип. Когда вы пытаетесь получить доступ к свойству или методу объекта, и это свойство/метод не найдено в самом объекте, поиск продолжается по цепочке прототипов, пока свойство/метод не будет найден или не будет достигнут конец цепочки прототипов (прототип null).
Пример:
let animal = {
eats: true,
walk() {
console.log("Animal walk");
}
};
let rabbit = {
jumps: true,
proto: animal
};
rabbit.walk(); // Animal walk
console.log(rabbit.eats); // true
В этом примере объект rabbit наследует свойство eats и метод walk от объекта animal через прототипную цепочку.
Основные принципы
1️⃣ Прототипная цепочка: Когда вы обращаетесь к свойству объекта, автоматически ищет это свойство в объекте, а затем — в его прототипах, пока не достигнет конца цепочки прототипов.
2️⃣ Object.prototype: В вершине прототипной цепочки находится Object.prototype. Он не имеет прототипа и содержит методы, доступные всем объектам, такие как toString(), hasOwnProperty() и другие.
3️⃣ Создание объектов с определённым прототипом: Для создания объектов с указанием прототипа можно использовать Object.create(proto), где proto — объект, который должен стать прототипом для нового объекта.
Отличия от классического наследования
В отличие от него, прототипное наследование не использует классы как таковые (до введения class в ES6, которые являются "синтаксическим сахаром" над прототипным наследованием). Вместо этого объекты напрямую наследуют свойства и методы от других объектов.
Прототипное наследование является мощной особенностью, позволяющей объектам наследовать поведение от других объектов. Это обеспечивает гибкость и возможности для повторного использования кода без строгой иерархии классов, характерной для классических моделей наследования.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхEvent), используемые для управления поведением событий в веб-приложениях. Они позволяют контролировать стандартное поведение браузера и распространение событий в DOM-дереве.
e.preventDefault()
Предотвращает выполнение стандартного действия, ассоциированного с событием. Это может быть полезно во многих случаях, например, когда нужно остановить отправку формы по умолчанию при нажатии на кнопку submit, чтобы вместо этого обработать данные формы.
Пример:
document.querySelector('form').addEventListener('submit', function(e) {
e.preventDefault(); // Предотвращает отправку формы
// Здесь может быть код для обработки данных формы
});
e.stopPropagation()
Останавливает дальнейшее распространение события по DOM-дереву. В DOM события распространяются тремя фазами: захват (capturing), достижение целевого элемента (target), и всплытие (bubbling). e.stopPropagation() предотвращает переход события к следующим обработчикам на текущей фазе и на других фазах.
Пример:
document.querySelector('#child').addEventListener('click', function(e) {
e.stopPropagation(); // Останавливает распространение события клика дальше по DOM-дереву
console.log('Клик по дочернему элементу');
});
document.querySelector('#parent').addEventListener('click', function() {
console.log('Клик по родительскому элементу');
});
В этом примере, несмотря на то что клик происходит и на дочернем, и на родительском элементе, благодаря e.stopPropagation() в консоль будет выведено только сообщение от дочернего элемента.
Зачем они нужны
-e.preventDefault() используется для контроля над поведением браузера, чтобы предотвратить выполнение действий по умолчанию, что позволяет разработчикам реализовывать собственную логику обработки событий.
-e.stopPropagation() позволяет избежать нежелательного взаимодействия с другими обработчиками событий, расположенными выше или ниже по DOM-дереву, предотвращая таким образом возможные побочные эффекты от всплытия или захвата событий.
Оба эти метода играют важную роль в создании интерактивных веб-приложений, давая точный контроль над поведением событий.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхconst person = {
name: 'Алексей',
age: 30,
job: 'Инженер'
};
// Деструктуризация объекта
const { name, age, job } = person;
console.log(name); // Алексей
console.log(age); // 30
console.log(job); // Инженер
Также можно задать переменным другие имена, отличные от ключей объекта:
const { name: personName, age: personAge } = person;
console.log(personName); // Алексей
console.log(personAge); // 30
Деструктуризация массивов
Используется порядок элементов. Значения из массива присваиваются переменным в соответствии с их позицией.
const rgb = [255, 200, 0];
// Деструктуризация массива
const [red, green, blue] = rgb;
console.log(red); // 255
console.log(green); // 200
console.log(blue); // 0
Параметры функции
Деструктуризация также может использоваться в них для более удобной работы со свойствами передаваемых объектов или элементами массивов.
function introduce({ name, age }) {
console.log(Меня зовут ${name}, мне ${age} лет.);
}
introduce(person); // Меня зовут Алексей, мне 30 лет.
Значения по умолчанию
Можно задать его для переменных, на случай, если такого свойства нет в объекте или элемента нет в массиве.
const { name, hobby = 'Чтение' } = person;
console.log(hobby); // Чтение
Деструктуризация предоставляет удобный способ доступа к элементам массивов и свойствам объектов, позволяя писать более чистый и понятный код. Это особенно полезно при работе с функциями, которые принимают объекты с множеством параметров или при необходимости извлечения нескольких значений из массивов и объектов.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхlocalStorage и sessionStorage является частью Web Storage API, предоставляемого современными веб-браузерами для сохранения данных на стороне клиента. Хотя оба механизма предназначены для хранения информации в формате ключ-значение и имеют похожий API, между ними есть ключевые отличия в поведении и области применения.
localStorage
- Долгосрочное хранение: Данные, сохранённые в нем, остаются в браузере пользователя до тех пор, пока явно не будут удалены программно с помощью JavaScript или пользователем вручную. Это означает, что информация не исчезает после закрытия браузера или перезагрузки компьютера.
- Объём данных: В нем можно сохранять до 5-10 МБ данных (в зависимости от браузера), что делает его подходящим для хранения небольших объёмов информации.
- Ограничения: Данные доступны только в пределах того же домена, что предотвращает доступ к данным для других сайтов.
sessionStorage
- Сеансовое хранение: он сохраняет данные только в течение сессии страницы — данные исчезают после закрытия вкладки или окна браузера. Это делает sessionStorage идеальным для хранения данных, актуальных в рамках одной сессии работы с веб-приложением, например, информации о состоянии интерфейса или введённых пользователями данных форм.
- Объём данных: Как и localStorage, он обычно позволяет сохранять до 5-10 МБ данных.
- Ограничения: Данные в нем доступны только в рамках одной вкладки браузера, и другие вкладки с тем же сайтом не будут иметь к ним доступ.
Основное отличие между localStorage и sessionStorage заключается в продолжительности хранения данных и области их видимости. localStorage предназначен для долгосрочного хранения данных, доступных между сессиями браузера и вкладками, тогда как sessionStorage предоставляет механизм для хранения данных в течение одной сессии вкладки, что делает его более подходящим для временной информации, специфичной для конкретной сессии пользователя. Выбор между ними зависит от потребностей приложения в хранении данных на стороне клиента.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхp {
color: red;
font-size: 16px;
}
В этом примере выбираются все параграфы (p), текст в которых будет окрашен в красный цвет (color: red;) и иметь размер шрифта 16 пикселей (font-size: 16px;).
Использование CSS:
Может быть подключен к HTML-документу тремя способами:
1️⃣ Внешний стилевой файл: Правила хранятся в отдельном файле, который подключается к HTML-документу с помощью тега <link>.
2️⃣ Внутренний стиль: Правила находятся непосредственно в HTML-документе внутри тега <style>.
3️⃣ Инлайновые стили: Стили применяются непосредственно к HTML-элементу через атрибут style.
CSS — это мощный инструмент для стилизации веб-страниц, который предоставляет разработчикам гибкие возможности для создания визуально привлекательных, адаптивных и доступных интерфейсов. Понимание и умение применять CSS является ключевым навыком для веб-разработчиков.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхtagName — выбирает все элементы данного типа (например, div, p).
Селекторы классов
- .className — выбирает все элементы с указанным классом.
Селекторы идентификаторов
- #idName — выбирает элемент с указанным идентификатором.
Селекторы атрибутов
- [attribute] — выбирает все элементы с указанным атрибутом.
- [attribute="value"] — выбирает все элементы с указанным атрибутом и значением.
- [attribute^="value"] — выбирает все элементы, значение атрибута которых начинается с указанной строки.
- [attribute$="value"] — выбирает все элементы, значение атрибута которых заканчивается указанной строкой.
- [attribute="value"] — выбирает все элементы, значение атрибута которых содержит указанную строку.
Селекторы потомков и дочерних элементов
- parent > child — выбирает все дочерние элементы child, непосредственно находящиеся внутри parent.
- ancestor descendant — выбирает все элементы descendant, находящиеся внутри ancestor (включая вложенные).
Селекторы соседей и братьев
- prev + next — выбирает элемент next, непосредственно следующий за prev.
- prev ~ siblings — выбирает всех соседей siblings, которые следуют за prev на том же уровне вложенности.
Псевдоклассы
- :hover — выбирает элемент при наведении курсора мыши.
- :focus — выбирает элемент, когда он находится в фокусе.
- :nth-child(n) — выбирает n-ый дочерний элемент.
- :first-child и :last-child — выбирают первый и последний дочерние элементы соответственно.
- :not(selector) — выбирает элементы, которые не соответствуют указанному селектору.
Псевдоэлементы
- ::before и ::after — позволяют вставлять содержимое до или после содержимого элемента.
- ::first-letter и ::first-line — выбирают первую букву или первую строку текста элемента.
Эти селекторы можно комбинировать для создания более сложных правил выбора элементов. Овладение различными типами селекторов позволяет гибко управлять стилизацией веб-страниц.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхsetTimeout
✅ setInterval
✅ setImmediate (Node.js)
✅ Запросы к серверу через XMLHttpRequest или fetch (не сам запрос, а обработка результата)
✅ I/O операции (в Node.js)
Микрозадачи (Micro-tasks):
Также управляются циклом событий, но они имеют более высокий приоритет, чем макрозадачи. Они выполняются сразу после завершения текущей исполняемой задачи и перед тем, как Event Loop перейдет к следующей макрозадаче. Это означает, что все они в очереди будут выполнены до начала выполнения следующей макрозадачи.
Примеры:
✅ Promise.then/catch/finally
✅ queueMicrotask
✅ MutationObserver
Различия между макро и микрозадачами:
1️⃣ Приоритет: Микрозадачи имеют более высокий приоритет по сравнению с макрозадачами. Все микрозадачи в очереди будут выполнены до начала следующего цикла Event Loop и до того, как будет взята новая макрозадача.
2️⃣ Время выполнения: Микрозадачи выполняются непосредственно после текущей задачи и перед тем, как браузер получит возможность перерисовать страницу или обработать другие события, такие как ввод пользователя. Макрозадачи же разделяются циклами Event Loop.
3️⃣ Источники: Макро- и микрозадачи поступают из разных источников. Например, таймеры (setTimeout, setInterval) и I/O операции генерируют макрозадачи, в то время как обработчики промисов (then, catch, finally) создают микрозадачи.
Понимание разницы между макро- и микрозадачами критически важно для понимания того, как обрабатываются асинхронные операции, что позволяет разработчикам более эффективно управлять асинхронным кодом, избегать блокировок и создавать более отзывчивые приложения.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовых::), за которым следует название псевдоэлемента. Например, ::before или ::after.
Распространенные псевдоэлементы:
- ::before и ::after: Позволяют вставлять содержимое до или после содержимого выбранного элемента соответственно. Очень часто используются для добавления декоративных элементов.
p::before {
content: "«";
color: blue;
}
p::after {
content: "»";
color: blue;
}
-::first-line: Применяет стили к первой строке текста в блочном элементе.
p::first-line {
font-weight: bold;
}
- ::first-letter: Применяет стили к первой букве текста в блочном элементе.
p::first-letter {
font-size: 200%;
}
- ::selection: Применяет стили к части текста, которую пользователь выделил.
p::selection {
background: yellow;
}
Особенности работы:
✅ Работают как часть документа, но на самом деле не существуют в DOM-дереве, а создаются стилями.
✅ Чтобы псевдоэлементы ::before и ::after отображались, необходимо задать свойство content, даже если оно пустое (content: "";).
✅ Могут быть стилизованы почти так же, как обычные элементы, но есть некоторые ограничения, например, связанные с взаимодействием с JavaScript.
Псевдоэлементы удобны для добавления декоративных элементов, создания специальных эффектов при взаимодействии с текстом и элементами страницы, а также для улучшения пользовательского интерфейса без изменения HTML-кода. Они позволяют сделать дизайн более гибким и интересным, облегчая поддержку и обновление стилей.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовыхусловие ? выражение1 : выражение2.
Структура тернарного оператора:
- Условие: Любое выражение, которое оценивается как true (истина) или false (ложь).
- Выражение1: Выполняется, если условие истинно (true).
- Выражение2: Выполняется, если условие ложно (false).
Пример:
let age = 18;
let status = age >= 18 ? 'взрослый' : 'несовершеннолетний';
console.log(status); // Выведет: взрослый
В этом примере условие age >= 18 проверяет, является ли возраст человека 18 лет или более. Если условие истинно, переменной status присваивается значение 'взрослый'. В противном случае — 'несовершеннолетний'.
Преимущества:
✅ Краткость и удобство записи для простых условных конструкций.
✅ Уменьшает количество кода по сравнению с использованием стандартных условных операторов (if...else).
Недостатки:
❌ Может ухудшить читаемость кода при использовании сложных условий или вложенных тернарных операторов.
❌ Использование более одного тернарного оператора в одном выражении может сделать код трудным для понимания.
Лучшие практики:
✅ Для простых условных выражений.
✅ Избегайте вложенности тернарных операторов, так как это может сделать код менее читаемым.
✅ Рассмотрите возможность использования стандартного условного оператора if...else для более сложных условий или когда требуется выполнение блоков кода, а не просто выбор между двумя выражениями.
Тернарный оператор является полезным инструментом в арсенале программиста, позволяя писать более краткий и иногда более элегантный код, но его следует использовать с умом, чтобы не ухудшить читаемость программы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти к Списку всех вопросов на Frontend Developer. Ставь 👍 если нравится контент.
🔐 База собесов | 🔐 База тестовых
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
