Питання на співбесіді з JavaScript з відповідями
Нативний JS: типи, замикання, this, прототипи, асинхронність і event loop, DOM та браузерні API.
225 запитань для співбесіди з теми JavaScript з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- Closures
- Event loop
- Promises
- Prototypes
- DOM
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
JavaScript · Junior
- Скільки типів даних у JavaScript за специфікацією?
Правильна відповідь: 8: сім примітивів і
objectПримітиви:
number,bigint,string,boolean,null,undefined,symbol. Усе інше -object, включно з масивами, функціями, датами. Функції - це об'єкти, хочаtypeofдля них повертає'function'. - Що поверне
typeof null?Правильна відповідь:
'object'Це історична помилка першої реалізації мови, яку залишили заради сумісності.
null- окремий примітив. Перевіряти його треба строгим порівнянням:value === null. - Що поверне
typeof NaN?Правильна відповідь:
'number'NaN(Not-a-Number) - спеціальне значення числового типу, результат некоректної математичної операції, наприклад0 / 0абоNumber('abc'). Перевірка -Number.isNaN(x). - Чим
letвідрізняється відvar?Правильна відповідь:
letобмежений блоком{},var- функцієюЗмінна
var, оголошена всерединіifчиfor, видима в усій функції. Крім того,varпіднімається зі значеннямundefinedі на верхньому рівні стає властивістюwindow, аletіconstдо оголошення перебувають у «тимчасовій мертвій зоні».
JavaScript · Middle
- Чим
call,applyіbindвідрізняються один від одного?Правильна відповідь:
call/applyвикликають одразу,bindповертає нову функціюfn.call(ctx, a, b),fn.apply(ctx, [a, b])- негайний виклик із заданимthis.fn.bind(ctx, a)повертає функцію з назавжди прив'язаним контекстом і частково застосованими аргументами. На стрілкові функції всі три не впливають: у них немає власногоthis. - Як рушій шукає властивість, якої немає в самого об'єкта?
Правильна відповідь: Піднімається ланцюжком прототипів, доки не знайде властивість або не дійде до
nullКожен об'єкт має приховане посилання
[[Prototype]](Object.getPrototypeOf). Так масиви отримуютьmapзArray.prototype, а всі об'єкти -toStringзObject.prototype. Пошук областями видимості стосується змінних, а не властивостей. - Що робить
Object.create(proto)?Правильна відповідь: Створює новий порожній об'єкт, прототипом якого буде
protoВластивості
protoне копіюються - вони доступні через ланцюжок прототипів.Object.create(null)створює об'єкт узагалі без прототипу: зручний «чистий» словник без успадкованих ключів на кшталтtoString. - Чим насправді є класи в JavaScript?
Правильна відповідь: Синтаксисом поверх прототипного успадкування з низкою додаткових перевірок
Методи класу потрапляють у
Class.prototype,extendsвибудовує ланцюжок прототипів. Але є відмінності від функцій-конструкторів: клас не можна викликати безnew, тіло виконується в строгому режимі, методи неперелічувані, є приватні поля#xіstatic.
JavaScript · Senior
- Як event loop обробляє задачі в браузері?
Правильна відповідь: Одна макрозадача, потім уся черга мікрозадач, потім можливий рендер
Після кожної макрозадачі (скрипт, подія, таймер) черга мікрозадач спорожнюється повністю, включно з доданими під час виконання. Потім браузер може оновити відмальовування (з викликом
requestAnimationFrame), якщо настав час кадру. Тому довгий ланцюжок мікрозадач теж блокує рендер. - Як глобально відстежити необроблені відхилення промісів у браузері?
Правильна відповідь: Подія
unhandledrejectionнаwindowwindow.addEventListener('unhandledrejection', e => report(e.reason))- стандартний спосіб надсилати такі помилки в моніторинг. Синхронні необроблені помилки ловить подіяerrorнаwindow. МетодуPromise.onErrorнемає. - Що робить
for await...of?Правильна відповідь: Перебирає асинхронний ітерований об'єкт, чекаючи на кожне значення
Працює з об'єктами, що мають
Symbol.asyncIterator: async-генераторами, потоками (ReadableStream), пагінацією API. Ітерації йдуть послідовно. Для паралельної обробки масиву промісів використовуютьPromise.all. - Для чого використовують
Proxy?Правильна відповідь: Щоб перехоплювати операції над об'єктом: читання, запис, видалення
Пастки
get,set,has,deletePropertyта ін. дають змогу реалізувати реактивність (так працює Vue 3), валідацію, логування, значення за замовчуванням.Reflectнадає стандартну поведінку операцій для використання всередині пасток.
Збірні тести з цією темою
Запитання з кількох тем одразу - як на співбесіді на конкретну вакансію.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід: debounce, throttle, deepClone, Promise.all, EventEmitter, LRU-кеш та інші.
Відкрити задачі →