Собеседование через неделю. Времени на чтение книг нет. Нужен чёткий план: что повторить, что решить, на чём сконцентрироваться.
Составили пошаговый план на 7 дней. Каждый день — конкретная тема, список задач и советы. Не нужно учить всё подряд — нужно решать задачи и понимать, почему решение работает именно так.
А чтобы теория не оставалась теорией — решайте задачи на Девстанции. Там есть проверка кода и AI-ревью, которое подскажет, как написать лучше.
Цель: уверенно объяснить разницу между var, let, const, знать типы данных и понимать, что такое hoisting.
string, number, boolean, null, undefined, object, symbol, bigintvar vs let vs const — область видимости, повторное объявление== vs === — приведение типов// Задача 1: Что выведет.console.log?
var x = 1;
function foo() {
console.log(x);
var x = 2;
}
foo();
// Задача 2: Сколько типов данных в JavaScript?
console.log(typeof null);
console.log(typeof undefined);
console.log(typeof NaN);
// Задача 3: Чем отличается?
let a = { name: "Alice" };
const b = a;
b.name = "Bob";
console.log(a.name);Не заучивайте определения. Объясняйте своими словами. На собеседовании ценят понимание больше, чем зубрёжку.
Цель: понимать, как работает this, замыкания и разница между функциональными и стрелочными функциями.
this — как определяется контекст// Задача 1: Реализуйте counter
function createCounter() {
// ваш код
}
const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
counter.decrement(); // 1
// Задача 2: Что выведет?
const obj = {
name: "Alice",
greet() {
console.log(`Hello, ${this.name}`);
},
greetArrow: () => {
console.log(`Hello, ${this.name}`);
},
};
obj.greet();
obj.greetArrow();
// Задача 3: Реализуйте debounce
function debounce(fn, delay) {
// ваш код
}Замыкание — это самая частая тема на собеседовании. Убедитесь, что можете объяснить, как функция «запоминает» переменные из внешней области видимости.
Цель: уверенно использовать методы массивов, деструктуризацию, spread/rest и работать с вложенными структурами.
map, filter, reduce, find, some, every, flatObject.keys, Object.values, Object.entries// Задача 1: Сгруппируйте товары по категории
const items = [
{ name: "Phone", category: "electronics" },
{ name: "Book", category: "education" },
{ name: "Laptop", category: "electronics" },
{ name: "Pen", category: "education" },
];
// Ожидаемый результат:
// { electronics: ["Phone", "Laptop"], education: ["Book", "Pen"] }
// Задача 2: Реализуйте flatten
function flatten(arr) {
// ваш код
}
// Задача 3: Найдите два числа, сумма которых равна target
function twoSum(arr, target) {
// ваш код
}Методы массивов — это 80% работы с данными в реальных проектах. На собеседовании часто просят решить задачу через reduce, даже если есть более простой способ.
Цель: понимать event loop, уверенно работать с промисами и async/await.
then, catch, finallyPromise.all, Promise.race, Promise.allSettled// Задача 1: Реализуйте myPromiseAll
function myPromiseAll(promises) {
// ваш код
}
// Задача 2: Что выведет и в каком порядке?
console.log("1");
setTimeout(() => console.log("2"), 0);
Promise.resolve().then(() => console.log("3"));
console.log("4");
// Задача 3: Загрузите данные последовательно
async function loadUsers(ids) {
// каждый запрос зависит от предыдущего
}
// Задача 4: Загрузите данные параллельно с таймаутом
async function loadWithTimeout(urls, ms) {
// ваш код
}На собеседовании обязательно спросят про event loop. Объясните разницу между макро- и микрозадачами. Это показывает глубокое понимание асинхронности.
Цель: знать, как работают события, делегирование и как взаимодействовать с API.
preventDefault vs stopPropagation// Задача 1: Реализуйте делегирование
// Клик по li должен выводить текст элемента
document.querySelector("ul").addEventListener("click", (e) => {
// ваш код
});
// Задача 2: Реализуйте fetch с ретраями
async function fetchWithRetry(url, retries = 3) {
// ваш код
}
// Задача 3: Реализуйте простой EventEmitter
class EventEmitter {
// ваш код
}Делегирование — это паттерн, который спрашивают на каждом собеседовании. Объясните, почему он эффективнее, чем вешать обработчик на каждый элемент.
Цель: решать базовые задачи на алгоритмы и объяснять сложность решения.
// Задача 1: Найдите пару с суммой равной target
function twoSum(nums, target) {
// O(n) решение через Map
}
// Задача 2: Максимальная длина подстрок уникальных символов
function lengthOfLongestSubstring(s) {
// sliding window
}
// Задача 3: Проверьте, является ли строка палиндромом
function isPalindrome(s) {
// два указателя
}
// Задача 4: Плоский массив
function flatten(arr) {
// рекурсия
}Объясняйте сложность каждого решения. Даже если ответ правильный, интервьюер оценит, если вы скажете: «Это O(n) по времени и O(1) по памяти».
Цель: провести mock-interview, закрепить слабые места, подготовиться морально.
== от ===?»this в стрелочной функции?»Не пытайтесь выучить всё. Лучше глубоко разобрать 5 тем, чем поверхностно — 20. Интервьюер видит, когда кандидат понимает, а когда просто заучил ответ.
Если до собеседования ещё есть день-два, добавьте:
this, замыканияНеделя — это достаточно, чтобы уверенно пройти собеседование. Главное — не зубрить, а решать задачи и объяснять свои решения. Каждый день по 2-3 часа focused practice дадут результат.
А если хотите закрепить навыки — решайте задачи на Девстанции. Там есть десятки задач разной сложности с автоматической проверкой и AI-ревью кода. Это как mock-interview, только без стресса и в любое время.