Frontend | Вопросы собесов
18.2K subscribers
40 photos
2 videos
1.47K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 В чём отличие между мутациями и действиями?

Мутации — это про изменение данных. Они простые и выполняются сразу. А действия — это про бизнес-логику и асинхронные операции. Действие вызывает мутацию, но само напрямую данные не меняет.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥4
🤔 Из каких секций состоит компонент Vue?

- <template> — разметка;
- <script> — логика компонента;
- <style> — стили, можно использовать scoped для изоляции; Дополнительно — setup, lang, scoped, module и др.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
2👍6🔥6
🤔 Когда брать абсолютные величины а когда относительные?

Выбор между абсолютными и относительными единицами измерения зависит от контекста использования и целей, которые вы преследуете. Рассмотрим подробнее, когда и почему стоит использовать те или иные единицы.

🚩Абсолютные величины (например, px, pt, cm, in)

Имеют фиксированные размеры и не зависят от других элементов или размеров экрана. Они всегда остаются одинаковыми, независимо от контекста.

🚩Когда использовать

1⃣Пиксели (`px`)
Точные размеры: Когда вам нужно задать точные размеры элементов, например, для пиксельной точности в дизайне.
Фиксированные элементы: Для элементов, размеры которых не должны изменяться в зависимости от экрана или родительского элемента (например, логотипы или иконки).
Маленькие декоративные элементы: Когда размеры элементов настолько малы, что относительные единицы могут привести к неконтролируемому результату.
.logo {
width: 100px;
height: 50px;
}


🚩Относительные величины (например, %, em, rem, vw, vh)

Изменяются в зависимости от других элементов или размеров экрана. Они позволяют создавать более гибкие и адаптивные макеты.

🟠Проценты (`%`)
Адаптивные макеты: Когда нужно, чтобы элемент занимал определенный процент от размера родительского элемента.
Контейнеры и блоки: Для ширины и высоты блоков, которые должны изменяться вместе с размерами родителя.
.container {
width: 80%;
height: 50%;
}


🟠Эм (`em`)
Шрифты: Когда нужно задавать размер шрифта относительно размера шрифта родителя.
Внутренние отступы и поля: Для создания элементов, которые масштабируются вместе с текстом.
.text {
font-size: 1.2em;
margin: 1em;
}


🟠Рем (`rem`):
Глобальная консистентность: Когда нужно задавать размер относительно корневого элемента (обычно <html>), что обеспечивает более предсказуемое масштабирование.
Шрифты и отступы: Для элементов, которые должны быть пропорциональны базовому размеру шрифта
body {
font-size: 16px;
}

.header {
font-size: 2rem; /* 32px */
margin: 1rem; /* 16px */
}


🟠Вьюпорт (`vw`, `vh`):
Адаптивные размеры: Когда размеры элементов должны быть пропорциональны размеру вьюпорта (окна браузера).
Фоновые изображения и видео: Для элементов, которые должны занимать определенный процент от экрана.
.hero {
width: 100vw;
height: 100vh;
}


🚩Комбинированное использование

Иногда можно комбинировать абсолютные и относительные единицы для достижения наилучшего результата.
.container {
width: 80%; /* Относительная ширина */
padding: 20px; /* Абсолютный внутренний отступ */
}

.text {
font-size: 1.5rem; /* Относительный размер шрифта */
margin: 2em; /* Относительный внешний отступ */
}


Ставь 👍 и забирай 📚 Базу знаний
👍10
🤔 Когда используются теги div и span?

- div — это блочный элемент, используется для структурирования больших участков контента;
- span — строчный элемент, применяется для выделения текста внутри других блоков без создания новой строки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍14🔥1
🤔 Зачем необходим DOM?

DOM (Document Object Model) представляет HTML-документ в виде дерева объектов. Он необходим для доступа, изменения и взаимодействия с элементами веб-страницы с помощью JavaScript.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥2
🤔 Что такое dispatch?

В контексте Frontend-разработки, dispatch — это метод, который отправляет (диспатчит) событие или действие. В зависимости от технологии dispatch может использоваться в Redux, EventTarget или React.

🟠`dispatch` в Redux
В Redux dispatch(action) используется для отправки (диспатча) действий (actions) в хранилище (store).
import { useDispatch } from 'react-redux';

const Counter = () => {
const dispatch = useDispatch();

return (
<button onClick={() => dispatch({ type: 'INCREMENT' })}>
Увеличить
</button>
);
};


🟠`dispatchEvent` в JavaScript (EventTarget API)
В нативном JavaScript метод dispatchEvent() используется для генерации пользовательских событий на DOM-элементах.
const button = document.querySelector("button");

// Создаём событие
const event = new Event("myCustomEvent");

// Добавляем слушатель событий
button.addEventListener("myCustomEvent", () => {
console.log("Событие вызвано!");
});

// Диспатчим событие
button.dispatchEvent(event); // Выведет: "Событие вызвано!"


🟠`dispatch` в React (useReducer)
В React-хуке useReducer dispatch используется для изменения состояния компонента.
import { useReducer } from 'react';

const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
return state;
}
};

const Counter = () => {
const [state, dispatch] = useReducer(reducer, { count: 0 });

return (
<button onClick={() => dispatch({ type: 'increment' })}>
{state.count}
</button>
);
};


Ставь 👍 и забирай 📚 Базу знаний
👍10
🤔 В чём отличие box-sizing: border-box от box-sizing: content-box?

- border-box включает padding и border в размер элемента — проще контролировать итоговую ширину.
- content-box — по умолчанию: ширина задаётся только для содержимого, а padding и border добавляются отдельно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍10🔥1
🤔 Зачем мы используем React.Fragment?

React.Fragment позволяет оборачивать несколько JSX-элементов без лишнего тега в DOM. Он нужен, когда требуется вернуть несколько элементов из компонента, не создавая дополнительных обёрток (<div> и т.п.).
Вот подробные текстовые ответы на твои вопросы, охватывающие темы React, Redux, верстку, TypeScript и веб-разработку в целом:


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊14👍6🔥3🤔3
🤔 Какие есть альтернативы SSR?

- SPA + пререндеринг (Scully, React Static, Nuxt generate) — хорош для статического контента.
- JAMStack + CDN — готовая сборка без сервера.
- Edge rendering — через CDN-функции (например, Cloudflare Workers).
- Hybrid rendering (ISR/SSG) — как в Next.js, где часть страниц SSR, часть — SSG.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥15👍2
🤔 Что такое функциональное программирование?

Функциональное программирование (FP) — это парадигма программирования, в которой основной единицей кода являются функции. В FP функции работают с данными без изменения внешнего состояния и без побочных эффектов.

🚩Основные принципы функционального программирования

🟠Чистые функции (Pure Functions)
Функция называется чистой, если:
При одинаковых входных данных всегда возвращает одинаковый результат.
Не изменяет внешние переменные (нет побочных эффектов).
Нечистая функция (изменяет внешнюю переменную)
let count = 0;
function increment() {
count += 1; // изменяет внешнюю переменную
return count;
}


Чистая функция (зависит только от аргументов)
function increment(num) {
return num + 1; // не меняет внешнее состояние
}
console.log(increment(5)); // 6
console.log(increment(5)); // 6 (всегда одинаковый результат)


🟠Иммутабельность (Immutable Data)
Данные не изменяются, а создаются новые версии объектов.
Изменение объекта (нефункциональный подход)
const user = { name: "Alice", age: 25 };
user.age = 26; // изменяет объект


Создание нового объекта (функциональный подход)
const user = { name: "Alice", age: 25 };
const updatedUser = { ...user, age: 26 }; // создаём новый объект


🟠Функции высшего порядка (Higher-Order Functions)
Функция, которая принимает другую функцию в аргумент или возвращает функцию.
const numbers = [1, 2, 3];
const squared = numbers.map(n => n * n); // [1, 4, 9]


Пример: Функция, возвращающая другую функцию
const multiplyBy = (factor) => (num) => num * factor;
const double = multiplyBy(2);
console.log(double(5)); // 10


🟠Функциональные методы массивов (map, filter, reduce)
Функциональные методы позволяют не мутировать массив, а создавать новый.
Используем map() для изменения элементов
const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2); // [2, 4, 6]


Используем filter() для фильтрации
const words = ["apple", "banana", "kiwi"];
const shortWords = words.filter(word => word.length < 6); // ["kiwi"]


Используем reduce() для вычислений
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, num) => acc + num, 0); // 10


🟠Каррирование (Currying)
Разделение функции на несколько функций, каждая принимает по одному аргументу.
function sum(a, b) {
return a + b;
}
console.log(sum(2, 3)); // 5


Пример: Каррированная функция
const sum = (a) => (b) => a + b;
console.log(sum(2)(3)); // 5


Ставь 👍 и забирай 📚 Базу знаний
1👍17
🤔 Какие хуки добавляют для подключения роутера?

Во Vue с Vue Router:
- beforeRouteEnter — до создания компонента;
- beforeRouteUpdate — при смене параметров маршрута;
- beforeRouteLeave — при уходе с маршрута; Используются для логики навигации, авторизации и пр.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊7👍4🤔2🔥1
🤔 Какое свойство Flexbox отвечает за направление flex items?

Свойство flex-direction:
- row (по горизонтали),
- column (по вертикали),
- и их обратные варианты (row-reverse, column-reverse).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍10🔥2
🤔 Какие методологии есть?

Методологии в верстке и CSS:
- BEM (Block Element Modifier) — строгая иерархия классов;
- SMACSS — деление стилей на категории (base, layout, module, state);
- OOCSS (Object-Oriented CSS) — повторное использование объектов;
- Atomic CSS / Utility-first — минималистичные, многоклассовые подходы (Tailwind).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1🔥10👍2
🤔 Когда нужно использовать кнопки а когда ссылки?

В веб-разработке часто возникает вопрос: использовать кнопку (<button>) или ссылку (<a>) для взаимодействий? Хотя они внешне могут выглядеть одинаково, у них разные назначения и поведение.

🟠Когда использовать `<button>`?

Когда действие выполняется на странице без перехода на другую
Когда нужна интерактивность (отправка формы, открытие модального окна, запуск скрипта)
Отправка формы
Открытие/закрытие модального окна
Включение/выключение чего-то на странице
Взаимодействие с JavaScript (AJAX-запросы, события)
<button onclick="alert('Нажато!')">Кликни</button>


Пример кнопки в форме:
<form>
<input type="text" placeholder="Введите имя">
<button type="submit">Отправить</button>
</form>


🟠Когда использовать `<a>`?

Когда нужно перейти на другую страницу (или секцию сайта)
Когда ссылка ведет на внешний или внутренний ресурс
Навигация по сайту
Переход на другую страницу
Ссылки на соцсети, статьи, файлы
<a href="https://example.com">Перейти на сайт</a>


Ссылка внутри страницы (якорь)
<a href="#section">Перейти вниз</a>
<section id="section">Контент</section>


Открытие в новом окне
<a href="https://example.com" target="_blank" rel="noopener noreferrer">
Открыть в новой вкладке
</a>


🟠Ошибки и неправильное использование
Ошибка: использовать <button> вместо ссылки
<button onclick="window.location.href='https://example.com'">Перейти</button>


Ставь 👍 и забирай 📚 Базу знаний
👍11
🤔 Зачем мы разбиваем код на компоненты?

Чтобы улучшить читаемость, переиспользуемость и поддержку. Компоненты упрощают тестирование, изоляцию логики и позволяют собирать интерфейс как из конструктора.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍12
🤔 Что такое псевдоэлемент?

Это специальный синтаксис, позволяющий стилизовать определенные части элемента или добавлять специальные элементы (как бы "элементы-призраки"), не создавая для этого дополнительные теги в HTML. Псевдоэлементы предоставляют удобный способ внесения изменений в структуру документа, не затрагивая HTML.

🚩Синтаксис

Начинается с двойного двоеточия (::), за которым следует название псевдоэлемента. Например, ::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.

Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Как можно заставить Git что-то забыть?

Использовать git rm --cached файл, если нужно убрать файл из индекса, но оставить на диске. Для полной очистки из истории — git filter-branch, BFG Repo-Cleaner или git reset.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
8👍7🔥3
🤔 Что такое массив?

Это структура данных, которая представляет собой упорядоченный список элементов. В JavaScript массивы могут содержать любые типы данных: числа, строки, объекты, другие массивы и даже функции.

🚩Почему массивы нужны?

Массивы помогают удобно хранить и обрабатывать наборы данных. Вместо того чтобы создавать множество переменных, можно использовать массив, чтобы хранить сразу несколько значений и работать с ними с помощью специальных методов.

🚩Как используются массивы?

Массивы позволяют:
Хранить несколько значений в одной переменной
Перебирать элементы с помощью циклов
Добавлять, удалять, изменять элементы
Выполнять операции, например, сортировку и фильтрацию

🚩Как создать массив?

В JavaScript массив можно создать разными способами:
С использованием литерала массива
let fruits = ["яблоко", "банан", "апельсин"];


С использованием конструктора Array
let numbers = new Array(1, 2, 3, 4, 5);


🚩Как обращаться к элементам массива?

Доступ к элементу массива осуществляется по индексу (начинается с 0):
let fruits = ["яблоко", "банан", "апельсин"];
console.log(fruits[0]); // "яблоко"
console.log(fruits[1]); // "банан"


🚩Основные методы работы с массивами

Добавление элемента в конец push()
let arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1, 2, 3, 4]


Удаление последнего элемента pop()
arr.pop();
console.log(arr); // [1, 2, 3]


Добавление элемента в начало unshift()
arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]


Удаление первого элемента shift()
arr.shift();
console.log(arr); // [1, 2, 3]


Перебор массива forEach()
arr.forEach(item => console.log(item)); 


Фильтрация элементов filter()
let evenNumbers = arr.filter(num => num % 2 === 0);
console.log(evenNumbers); // [2]


Ставь 👍 и забирай 📚 Базу знаний
👍8
🤔 Как отследить изменение модели?

Способы:
- watch: следим за конкретным полем или выражением.
-
@input или @update:modelValue — события от v-model.
- computed с геттером и сеттером — можно ловить изменения при записи.
- emit из компонента — в родителе можно слушать события.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊4🔥2👍1
🤔 В чём преимущество синтаксического сахара в виде async await над promise?

Оба способа позволяют работать с асинхронным кодом в JavaScript, но async/await делает код чище, проще и удобнее.

🟠`async/await` проще читать и писать

Код на Promise.then() часто становится вложенным и запутанным
fetch("https://api.example.com/user")
.then(response => response.json())
.then(user => {
return fetch(`https://api.example.com/orders/${user.id}`);
})
.then(response => response.json())
.then(orders => {
console.log("Заказы:", orders);
})
.catch(error => console.error("Ошибка:", error));


Решение: async/await
async function getUserOrders() {
try {
const response = await fetch("https://api.example.com/user");
const user = await response.json();

const ordersResponse = await fetch(`https://api.example.com/orders/${user.id}`);
const orders = await ordersResponse.json();

console.log("Заказы:", orders);
} catch (error) {
console.error("Ошибка:", error);
}
}

getUserOrders();


async/await лучше обрабатывает ошибки
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => {
throw new Error("Ошибка в обработке данных");
})
.catch(error => console.error("Ошибка:", error));


async/await + try/catch – мощная обработка ошибок
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("Ошибка HTTP " + response.status);

const data = await response.json();
console.log(data);
} catch (error) {
console.error("Ошибка:", error);
}
}
fetchData();


async/await удобен в for и try/catch
const urls = ["url1", "url2", "url3"];
urls.forEach(url => {
fetch(url)
.then(response => response.json())
.then(data => console.log(data));
});


async/await в for of
async function fetchAll(urls) {
for (const url of urls) {
const response = await fetch(url);
const data = await response.json();
console.log(data);
}
}
fetchAll(["url1", "url2", "url3"]);


async/await работает с try/finally
async function fetchData() {
try {
console.log("Запрос данных...");
const response = await fetch("https://api.example.com");
const data = await response.json();
console.log("Данные:", data);
} catch (error) {
console.error("Ошибка:", error);
} finally {
console.log("Закрываем соединение...");
}
}
fetchData();


async/await можно использовать внутри Promise.all()
Иногда Promise.all() быстрее, потому что запускает промисы параллельно.
async function fetchMultiple() {
const [user, orders] = await Promise.all([
fetch("https://api.example.com/user").then(res => res.json()),
fetch("https://api.example.com/orders").then(res => res.json())
]);

console.log(user, orders);
}
fetchMultiple();


Ставь 👍 и забирай 📚 Базу знаний
👍9💊2
🤔 В чём разница между event.preventDefault и event.stopPropagation?

1. event.preventDefault: предотвращает стандартное поведение элемента (например, отправку формы).
2. event.stopPropagation: останавливает дальнейшее распространение события по дереву DOM.
3. Часто используются совместно для полной обработки события без влияния на другие элементы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥3