Frontend | Вопросы собесов
Сайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+T0COHtFzCJkwMDUy Задачи t.me/+_tcX2w2EmvdmMTgy Вакансии t.me/+CgCAzIyGHHg0Nzky
Показати більше📈 Аналітичний огляд Telegram-каналу Frontend | Вопросы собесов
Канал Frontend | Вопросы собесов (@easy_javascript_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 270 підписників, посідаючи 7 345 місце в категорії Технології та додатки та 36 940 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 270 підписників.
За останніми даними від 15 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -134, а за останні 24 години на -7, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 9.73%. Протягом перших 24 годин після публікації контент зазвичай збирає 5.72% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 778 переглядів. Протягом першої доби публікація в середньому набирає 1 046 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 9.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, браузер, html, border, flex.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky”
Завдяки високій частоті оновлень (останні дані отримано 16 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
map(), который позволяет перебрать массив и вернуть JSX для каждого элемента. Это удобный и декларативный способ создания списков элементов.
🚩Пример использования `map()` для отрисовки массива
import React from 'react';
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 35 }
];
const UserList = () => {
return (
<div>
<h1>User List</h1>
<ul>
{users.map(user => (
<li key={user.id}>
{user.name} - {user.age} years old
</li>
))}
</ul>
</div>
);
};
export default UserList;
1⃣Использование map()
{users.map(user => (
<li key={user.id}>
{user.name} - {user.age} years old
</li>
))}
2⃣Атрибут key
<li key={user.id}>
🚩Отрисовка сложных компонентов
Если каждый элемент массива представляет собой более сложный компонент, можно создать отдельный компонент для каждого элемента и использовать его внутри map().
import React from 'react';
const users = [
{ id: 1, name: 'Alice', age: 25, email: 'alice@example.com' },
{ id: 2, name: 'Bob', age: 30, email: 'bob@example.com' },
{ id: 3, name: 'Charlie', age: 35, email: 'charlie@example.com' }
];
const UserItem = ({ user }) => {
return (
<div className="user-item">
<h2>{user.name}</h2>
<p>Age: {user.age}</p>
<p>Email: {user.email}</p>
</div>
);
};
const UserList = () => {
return (
<div>
<h1>User List</h1>
{users.map(user => (
<UserItem key={user.id} user={user} />
))}
</div>
);
};
export default UserList;
1⃣Создание компонента для элемента списка
const UserItem = ({ user }) => {
return (
<div className="user-item">
<h2>{user.name}</h2>
<p>Age: {user.age}</p>
<p>Email: {user.email}</p>
</div>
);
};
2⃣Использование компонента внутри map()
{users.map(user => (
<UserItem key={user.id} user={user} />
))}
Ставь 👍 и забирай 📚 Базу знанийsetState() может быть асинхронным. Это означает, что состояние компонента не обязательно будет обновлено сразу после вызова setState(). Вместо этого, React может сгруппировать несколько вызовов setState() для оптимизации производительности.
🟠Мерджинг состояния
При вызове setState() React сливает (мерджит) новый объект состояния с текущим состоянием. Это позволяет обновлять только те части состояния, которые изменились, без перезаписи всего состояния.
🚩Синтаксис
🟠Первый аргумент
Может быть объектом или функцией. Объект: Новый фрагмент состояния, который нужно объединить с текущим состоянием Функция: Функция, которая принимает текущее состояние и пропсы и возвращает новый фрагмент состояния.
🟠Второй аргумент (необязательный)
Колбэк-функция, которая будет вызвана после того, как состояние обновится и компонент перерисуется.
🚩Примеры использования
Объект как аргумент
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.incrementCount}>Increment</button>
</div>
);
}
}
🟠Функция как аргумент
Использование функции вместо объекта рекомендуется, когда новое состояние зависит от предыдущего состояния, чтобы избежать потенциальных проблем с асинхронностью.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
incrementCount = () => {
this.setState((prevState, props) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.incrementCount}>Increment</button>
</div>
);
}
}
🟠Колбэк-функция
Второй аргумент setState() — это колбэк, который вызывается после того, как состояние было обновлено и компонент перерисован.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 }, () => {
console.log('Состояние обновлено:', this.state.count);
});
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.incrementCount}>Increment</button>
</div>
);
}
}
🚩Важные замечания
🟠Не изменяйте состояние напрямую
Изменение состояния напрямую (например, this.state.count = 1) не вызовет перерисовку компонента. Всегда используйте setState().
🟠Batching (группировка)
React может группировать несколько вызовов setState() для повышения производительности. Поэтому состояние может быть обновлено асинхронно.
🟠Компоненты-классы и хуки
В функциональных компонентах для управления состоянием используются хуки, такие как useState. setState() используется только в компонентах-классах.
Ставь 👍 и забирай 📚 Базу знанийconst person = {
name: 'Alice',
age: 25
};
console.log(person.name); // 'Alice'
console.log(person.age); // 25
🟠Доступ через квадратные скобки
Квадратные скобки позволяют получать свойства с именами, которые могут содержать пробелы, специальные символы или быть результатом выражения. Это также полезно, когда имя свойства хранится в переменной.
const person = {
'first name': 'Alice',
age: 25
};
console.log(person['first name']); // 'Alice'
console.log(person['age']); // 25
const propertyName = 'age';
console.log(person[propertyName]); // 25
🟠Деструктуризация объектов
Деструктуризация позволяет извлекать свойства из объекта и присваивать их переменным. Это особенно полезно для извлечения нескольких свойств одновременно.
const person = {
name: 'Alice',
age: 25
};
const { name, age } = person;
console.log(name); // 'Alice'
console.log(age); // 25
🟠Использование Object.keys, Object.values и Object.entries
Эти методы позволяют получать массивы ключей, значений или пар ключ-значение соответственно.
Object.keys: Возвращает массив ключей объекта.
const person = {
name: 'Alice',
age: 25
};
const keys = Object.keys(person);
console.log(keys); // ['name', 'age']
Object.values: Возвращает массив значений объекта.
const person = {
name: 'Alice',
age: 25
};
const values = Object.values(person);
console.log(values); // ['Alice', 25]
Object.entries: Возвращает массив пар ключ-значение.
const person = {
name: 'Alice',
age: 25
};
const entries = Object.entries(person);
console.log(entries); // [['name', 'Alice'], ['age', 25]]
🟠Проверка наличия свойств
Перед доступом к свойству можно проверить его наличие с помощью оператора in или метода hasOwnProperty.
Оператор in
const person = {
name: 'Alice',
age: 25
};
console.log('name' in person); // true
console.log('gender' in person); // false
Метод hasOwnProperty
const person = {
name: 'Alice',
age: 25
};
console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('gender')); // false
Ставь 👍 и забирай 📚 Базу знанийtry...catch позволяет обрабатывать ошибки, возникающие в блоке try. Если возникает ошибка, выполнение кода переходит к блоку catch.
try {
// Код, который может вызвать ошибку
let result = riskyOperation();
console.log(result);
} catch (error) {
// Обработка ошибки
console.error('Произошла ошибка:', error.message);
}
Пример использования
function riskyOperation() {
throw new Error('Что-то пошло не так');
}
try {
riskyOperation();
} catch (error) {
console.error('Произошла ошибка:', error.message); // Произошла ошибка: Что-то пошло не так
}
🟠Использование блока finally
Блок finally выполняется после того, как были выполнены блоки try и catch. Он выполняется независимо от того, произошла ли ошибка.
try {
let result = riskyOperation();
console.log(result);
} catch (error) {
console.error('Произошла ошибка:', error.message);
} finally {
console.log('Этот блок выполнится в любом случае');
}
🟠Обработка ошибок в асинхронных функциях
Для обработки ошибок в асинхронных функциях, использующих async/await, также можно использовать try...catch.
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error('Произошла ошибка при получении данных:', error.message);
}
}
fetchData();
🟠Использование промисов
При работе с промисами можно использовать методы catch и finally для обработки ошибок.
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Произошла ошибка при получении данных:', error.message);
})
.finally(() => {
console.log('Запрос завершен');
});
🟠Глобальная обработка ошибок
Для глобальной обработки ошибок можно использовать обработчики событий window.onerror и window.onunhandledrejection. Обработка ошибок выполнения
window.onerror = function(message, source, lineno, colno, error) {
console.error('Произошла глобальная ошибка:', message);
return true; // предотвращает вывод ошибки в консоль браузера
};
Обработка неотловленных промисов
window.onunhandledrejection = function(event) {
console.error('Неотловленный отказ в промисе:', event.reason);
};
🟠Пользовательские ошибки
Можно создавать собственные ошибки с помощью класса Error.
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
try {
throw new CustomError('Это пользовательская ошибка');
} catch (error) {
console.error(error.name + ': ' + error.message); // CustomError: Это пользовательская ошибка
}
Ставь 👍 и забирай 📚 Базу знанийDate) или циклических ссылок.
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = JSON.parse(JSON.stringify(original));
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
🟠Использование рекурсивной функции для глубокого копирования
Этот метод позволяет точно контролировать процесс копирования и обрабатывать более сложные структуры данных.
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (Array.isArray(obj)) {
const arrCopy = [];
obj.forEach((item, index) => {
arrCopy[index] = deepClone(item);
});
return arrCopy;
}
const objCopy = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
objCopy[key] = deepClone(obj[key]);
}
}
return objCopy;
}
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = deepClone(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
🟠Использование библиотеки lodash
Lodash предоставляет удобную функцию cloneDeep для глубокого копирования объектов.
const _ = require('lodash');
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = _.cloneDeep(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
🟠Использование структурированной клонирования (Structured Clone)
Метод structuredClone позволяет создавать глубокие копии объектов. Этот метод является частью HTML Living Standard и поддерживается в некоторых современных браузерах и средах исполнения.
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = structuredClone(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
Ставь 👍 и забирай 📚 Базу знанийasync и await — это синтаксический сахар в JavaScript, предназначенный для упрощения работы с промисами и асинхронными операциями. Они позволяют писать асинхронный код, который выглядит как синхронный, улучшая его читаемость и удобство использования.
🚩Основные концепции
🟠`async`
Ключевое слово, которое используется перед функцией для обозначения её как асинхронной. Асинхронная функция всегда возвращает промис.
🟠`await`
Ключевое слово, которое используется внутри асинхронной функции для ожидания выполнения промиса. Оно приостанавливает выполнение функции до тех пор, пока промис не будет выполнен.
🚩Пример использования для асинхронных запросов
Пример с fetch
// Асинхронная функция для выполнения запроса и обработки данных
async function fetchData(url) {
try {
// Ожидание выполнения запроса
const response = await fetch(url);
// Проверка статуса ответа
if (!response.ok) {
throw new Error('Network response was not ok');
}
// Ожидание преобразования ответа в JSON
const data = await response.json();
// Работа с данными
console.log(data);
} catch (error) {
// Обработка ошибок
console.error('Fetch error:', error);
}
}
// Вызов асинхронной функции
fetchData('https://api.example.com/data');
1⃣Объявление асинхронной функции
async function fetchData(url) { ... }
2⃣Использование await для ожидания выполнения запроса
const response = await fetch(url);
3⃣Обработка ошибок с использованием try...catch
try {
...
} catch (error) {
...
}
4⃣Ожидание преобразования ответа в JSON
const data = await response.json();
🚩Плюсы
➕Читаемость
Код выглядит как синхронный, что упрощает его понимание и сопровождение.
➕Управление ошибками
Использование блоков try...catch делает обработку ошибок более явной и удобной.
➕Последовательность выполнения
синхронные операции выполняются в логической последовательности, что упрощает написание сложных асинхронных цепочек.
Ставь 👍 и забирай 📚 Базу знаний
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
