P
prepair.app
Пройти інтерв'ю →
EnglishУкраїнськаРусский
🟨

Питання на співбесіді JavaScript

Співбесіда з JavaScript крутиться навколо невеликого набору речей, які мова робить інакше за всі інші: замикання, `this`, прототипи та event loop. Розберіться з ними — і більшість решти питань закриються самі. Нижче ті, що ставлять найчастіше, кожне з еталонною відповіддю.

Junior · без досвіду / до 1 рокуMiddle · 2–4 роки досвідуSenior · 5+ років досвіду

Що запитують

Типи і приведення
Замикання та області видимості
`this` і прототипи
Event loop і асинхронність
Проміси та async/await
DOM, події та браузер

10 реальних питань з відповідями

До кожного питання — еталонна відповідь, з якою можна порівняти свою.

1

Які типи даних є в JavaScript?

Відповідь

Сім примітивів — string, number, boolean, null, undefined, symbol, bigint, — а все інше обʼєкти, включно з масивами і функціями. Примітиви копіюються за значенням, обʼєкти за посиланням, і звідси майже вся плутанина на кшталт «чому зміна однієї змінної змінила іншу». typeof null повертає 'object' — це баг 1995 року, який не можна полагодити, не зламавши веб.

2

Чим різняться `var`, `let` і `const`?

Відповідь

var має функціональну область видимості і виринає як undefined; let і const обмежені блоком і до оголошення перебувають у тимчасовій мертвій зоні, тому звернення до них раніше кидає помилку, а не віддає undefined. const забороняє перепризначення змінної, а не змінення обʼєкта, на який вона вказує: const arr = [] не заважає arr.push(). За замовчуванням const, let — коли справді перепризначуєте, var — ніколи.

3

Чим `==` відрізняється від `===`?

Відповідь

=== порівнює тип і значення, == спершу приводить типи за правилами, через які null == undefined істинне, а null == 0 хибне. Оскільки всю таблицю майже ніхто не памʼятає, робоче правило — завжди ===. Єдиний захисний виняток — x == null як коротка перевірка одразу на null і undefined.

4

Що таке замикання?

Відповідь

Функція разом з областю видимості, у якій вона створена і до якої зберігає доступ навіть після того, як зовнішня функція завершилася. Саме на цьому тримаються приватний стан, фабрики функцій і хуки: внутрішня функція зберігає живе посилання, а не копію. Класична пастка — var у циклі з setTimeout, де всі колбеки ділять одну привʼязку і друкують одне значення; let дає кожній ітерації свою.

5

Що таке `this` і чим він визначається?

Відповідь

Тим, як функцію викликано, а не тим, де оголошено. Виклик методом — this це обʼєкт перед крапкою; простий виклик — undefined у суворому режимі; виклик через new — новий обʼєкт; call, apply і bind задають явно. У стрілочних функцій свого this немає, вони беруть його з навколишньої області, тому вони і розвʼязали проблему колбеків, і тому ж не годяться як методи обʼєкта.

6

Як працює прототипне успадкування?

Відповідь

У кожного обʼєкта є прихований звʼязок з іншим обʼєктом — прототипом. При читанні відсутньої властивості рушій іде цим ланцюгом, доки не знайде її або не дійде до null. class — синтаксис поверх цього: він створює функцію-конструктор, в обʼєкті prototype якої лежать методи, тому всі екземпляри ділять одну копію кожного методу, а не носять свою.

7

Поясніть event loop, макрозадачі та мікрозадачі.

Відповідь

JavaScript виконується в одному потоці з чергою. Коли стек викликів порожніє, цикл вичерпує всю чергу мікрозадач — колбеки промісів, queueMicrotask, MutationObserver — і лише потім бере одну макрозадачу: колбек setTimeout або подію. Тому .then завжди виконується раніше за запланований раніше setTimeout(0), і тому нескінченний ланцюг мікрозадач здатен повністю заморозити відмальовування.

8

Чим `Promise.all` відрізняється від `Promise.allSettled`?

Відповідь

all відхиляється, щойно відхилився будь-який проміс, і результатів решти ви не отримуєте; allSettled завжди резолвиться, віддаючи статус по кожному. all беруть, коли при падінні однієї частини вся операція безглузда, allSettled — коли треба повідомити, що саме впало. І це не те саме, що послідовні await у циклі: ті виконуються один за одним, і зазвичай це випадковий баг продуктивності.

9

Чим поверхнева копія відрізняється від глибокої?

Відповідь

Поверхнева — спред або Object.assign — копіює верхній рівень, тому вкладені обʼєкти лишаються спільними і їх змінення зачіпає оригінал. Глибока дублює все дерево: structuredClone робить це нативно і дає раду циклам, Map і Date, тоді як старий прийом JSON.parse(JSON.stringify(x)) мовчки втрачає функції, undefined і перетворює дати на рядки.

10

Чим стрілочна функція відрізняється від звичайної?

Відповідь

У стрілочної немає свого this, немає arguments, немає prototype, і її не можна викликати через new. this вона бере лексично звідти, де оголошена, — за це її й люблять у колбеках і за це ж вона не годиться як метод обʼєкта чи прототипа. Конструктором і генератором вона теж бути не може.

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю JavaScript →
Безкоштовно · 3 інтерв'ю на місяць

Варто прочитати

Всі статті →

Інші спеціалізації

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing