Frontend | Вопросы собесов
19.3K subscribers
32 photos
3 videos
909 links
Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky
Download Telegram
🤔 Как уничтожить объект Web Worker?

Для завершения работы Web Worker используется метод terminate() со стороны главного потока или self.close() внутри самого воркера. Это освобождает ресурсы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
🤔 Какие статические методы promise знаешь?

Promise – это объект, представляющий отложенный результат (асинхронную операцию). Помимо new Promise(), у Promise есть статические методы, которые помогают работать с несколькими промисами.

🟠`Promise.resolve(value)` – создаёт выполненный промис
Возвращает успешно выполненный Promise с переданным значением.
Promise.resolve(42).then(console.log); // 42


🟠`Promise.reject(error)` – создаёт отклонённый промис
Возвращает промис в состоянии "отклонён" (rejected).
Promise.reject("Ошибка!").catch(console.error); // "Ошибка!"


🟠`Promise.all(promises)` – ждёт ВСЕ промисы или первый `reject`
Выполняет все промисы параллельно и ждёт, пока ВСЕ выполнятся.
Если один промис отклонится, Promise.all немедленно выдаст ошибку.
Promise.all([
Promise.resolve(10),
Promise.resolve(20),
Promise.resolve(30),
]).then(console.log); // [10, 20, 30]


Ошибка прерывает выполнение
Promise.all([
Promise.resolve(1),
Promise.reject("Ошибка!"),
Promise.resolve(3),
]).catch(console.error); // "Ошибка!"


🟠`Promise.allSettled(promises)` – ждёт ВСЕ промисы, не падает при `reject`
Возвращает массив состояний (fulfilled или rejected) каждого промиса.
Никогда не отклоняется, даже если есть ошибки.
Promise.allSettled([
Promise.resolve(100),
Promise.reject("Ошибка!"),
Promise.resolve(300),
]).then(console.log);


Выведет
[
{ status: "fulfilled", value: 100 },
{ status: "rejected", reason: "Ошибка!" },
{ status: "fulfilled", value: 300 }
]


🟠`Promise.race(promises)` – ждёт ТОЛЬКО первый завершённый промис
Возвращает результат ПЕРВОГО выполненного или отклонённого промиса.
Promise.race([
new Promise(res => setTimeout(() => res("Промис 1"), 500)),
new Promise(res => setTimeout(() => res("Промис 2"), 300)),
]).then(console.log); // "Промис 2" (он быстрее)


🟠`Promise.any(promises)` – ждёт ПЕРВЫЙ успешный промис
Возвращает результат ПЕРВОГО выполненного (fulfilled) промиса.
Если ВСЕ промисы отклонены (rejected), возвращает AggregateError.
Promise.any([
Promise.reject("Ошибка 1"),
Promise.resolve("Успех!"),
Promise.reject("Ошибка 2"),
]).then(console.log); // "Успех!"


Ошибка, если все промисы reject
Promise.any([
Promise.reject("Ошибка 1"),
Promise.reject("Ошибка 2"),
]).catch(console.error); // AggregateError: Все промисы отклонены


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Зачем в HTML5 введены события Server-Sent Events?

SSE (Server-Sent Events) позволяют одностороннюю передачу данных от сервера к клиенту через открытое соединение. Это альтернатива WebSocket'ам, когда клиенту нужно просто "слушать" события от сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍5💊1
🤔 Как уничтожить объект web worker?

В JavaScript, чтобы уничтожить объект Web Worker, необходимо использовать метод terminate(). Этот метод останавливает выполнение worker'а, освобождает связанные с ним ресурсы и завершает его работу. После вызова terminate() объект worker больше не может быть использован.

🚩Зачем уничтожать Web Worker?

Web Worker позволяет выполнять тяжелые операции в фоновом потоке, не блокируя основной поток (UI-поток). Однако, если worker больше не нужен, он продолжает существовать и занимает ресурсы (память, процессорное время). Чтобы избежать утечек памяти и оптимизировать работу приложения, важно уничтожать worker, когда он больше не используется.

🚩Как использовать `terminate()`?

Вы вызываете метод terminate() на экземпляре объекта worker. Это мгновенно останавливает выполнение фонового скрипта.
// Создаем worker
const myWorker = new Worker('worker.js');

// Выполняем какие-то операции через worker
myWorker.postMessage('Hello, worker!');

// Завершаем работу worker, когда он больше не нужен
myWorker.terminate();


🚩Важно помнить

1⃣После вызова terminate() worker полностью уничтожается и больше не может отправлять или получать сообщения.
2⃣Если есть обработчики событий, привязанные к worker (например, onmessage), они автоматически удаляются.
3⃣Доступ к worker после вызова terminate() не приведет к ошибке, но никакие операции через него больше работать не будут.
const worker = new Worker('worker.js');

// Отправляем сообщение
worker.postMessage('Start working');

// Завершаем работу worker
worker.terminate();

// Попытка отправить сообщение после уничтожения worker
worker.postMessage('Will this work?'); // Ничего не произойдет, worker уже завершен


🚩 Когда еще уничтожается worker?

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊1
🤔 Как исправить утечку памяти?

- Удалять обработчики событий (removeEventListener).
- Обнулять переменные, если объект больше не нужен.
- Использовать WeakMap/WeakSet для хранения временных ссылок.
- Следить за замыканиями и таймерами.
- Профилировать память в DevTools (вкладка Memory).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍2💊1
🤔 Когда использовать uselayuouteffect, а когда useeffect?

Оба этих хука выполняют побочные эффекты в React, но разница в том, когда именно они выполняются
useEffect выполняется после рендера и отрисовки в браузере.
useLayoutEffect выполняется сразу после рендера, но перед отрисовкой в браузере.

То есть useLayoutEffect блокирует рендер, а useEffect — нет.

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

useEffect выполняется асинхронно, после того как браузер отрисовал страницу.
Используется для:
- Запросов к API.
- Подключения WebSocket'ов или таймеров.
- Логирования данных.
- Изменения заголовка страницы (document.title).
import { useState, useEffect } from "react";

function App() {
const [count, setCount] = useState(0);

useEffect(() => {
document.title = `Вы кликнули ${count} раз`;
}, [count]); // Запускается после рендера

return <button onClick={() => setCount(count + 1)}>Клик: {count}</button>;
}


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

useLayoutEffect выполняется сразу после рендера, но перед тем, как браузер отобразит изменения.
Используется для
- Синхронных манипуляций с DOM.
- Измерения размеров элементов (getBoundingClientRect).
- Анимаций (например, при расчёте позиций).
import { useEffect, useLayoutEffect, useState } from "react";

function Example() {
const [width, setWidth] = useState(0);

useLayoutEffect(() => {
const box = document.getElementById("box");
setWidth(box.offsetWidth);
}, []);

return (
<div>
<div id="box" style={{ width: "100px", height: "50px", background: "red" }}></div>
<p>Ширина: {width}px</p>
</div>
);
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔1
🤔 Какие примитивные данные в JavaScript есть?

- string
- number
- bigint
- boolean
- undefined
- null
- symbol
Они не являются объектами и имеют иммутабельную природу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2🤔1
Please open Telegram to view this post
VIEW IN TELEGRAM
💊4
🤔 Расскажи про mobx

MobX — это библиотека для управления состоянием в JavaScript-приложениях, особенно в React. Она основана на реактивности и позволяет автоматически отслеживать изменения данных, обновляя интерфейс только там, где это необходимо.

🚩Основные принципы MobX

🟠Модели данных – `observable` (наблюдаемые)
MobX делает объекты реактивными, автоматически отслеживая их изменения.
import { makeAutoObservable } from "mobx";

class Store {
count = 0;

constructor() {
makeAutoObservable(this); // Автоматически делает свойства "наблюдаемыми"
}

increment() {
this.count++;
}
}

const store = new Store();


🟠Экшены (`actions`)
Это методы, которые изменяют состояние.
store.increment(); // Увеличит count и автоматически обновит UI


🟠Компоненты подписываются на изменения – `observer`
Чтобы React-компонент обновлялся при изменении данных, его нужно обернуть в observer (из mobx-react-lite).
import React from "react";
import { observer } from "mobx-react-lite";

const Counter = observer(({ store }) => (
<div>
<p>Счетчик: {store.count}</p>
<button onClick={() => store.increment()}>+</button>
</div>
));

export default Counter;


🟠Компьютед-свойства (`computed`)
Это вычисляемые значения, которые пересчитываются только при изменении зависимостей.
class Store {
count = 2;

constructor() {
makeAutoObservable(this);
}

get double() {
return this.count * 2;
}
}

const store = new Store();
console.log(store.double); // 4
store.count = 5;
console.log(store.double); // 10 (пересчиталось автоматически)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
💊2🤔1
🤔 Как сравнить объекты?

1. По ссылке: используется ===, который проверяет, ссылаются ли объекты на одно место в памяти.
2. По значению: необходимо пройти по ключам объектов и сравнить их значения вручную или с помощью библиотек, например Lodash.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое массив?

Это структура данных, которая представляет собой упорядоченный список элементов. В 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]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7