Pytania rekrutacyjne JavaScript z odpowiedziami
Czysty JS: typy, domknięcia, this, prototypy, asynchroniczność i event loop, DOM i API przeglądarki.
225 pytań na rozmowę rekrutacyjną z tematu JavaScript z odpowiedziami i wyjaśnieniami - poziomy Junior, Middle i Senior. Przykładowe pytania, testy online i zadania z kodu.
- Closures
- Event loop
- Promises
- Prototypes
- DOM
Pytania według poziomu
Junior
Podstawowe pojęcia i składnia · 50 pytań
Middle
Praktyka, niuanse i optymalizacja · 50 pytań
Senior
Architektura, mechanizmy wewnętrzne, przypadki brzegowe · 50 pytań
Przykładowe pytania
Kilka pytań z każdego poziomu z poprawną odpowiedzią i wyjaśnieniem.
JavaScript · Junior
- Ile typów danych ma JavaScript według specyfikacji?
Poprawna odpowiedź: 8: siedem prymitywów i
objectPrymitywy:
number,bigint,string,boolean,null,undefined,symbol. Wszystko inne toobject, w tym tablice, funkcje i daty. Funkcje są obiektami, choćtypeofzwraca dla nich'function'. - Co zwraca
typeof null?Poprawna odpowiedź:
'object'To historyczny błąd z pierwszej implementacji języka, zachowany dla kompatybilności.
nullto osobny prymityw. Sprawdza się go ścisłą równością:value === null. - Co zwraca
typeof NaN?Poprawna odpowiedź:
'number'NaN(Not-a-Number) to specjalna wartość typu liczbowego, wynik niepoprawnej operacji matematycznej, np.0 / 0lubNumber('abc'). Sprawdza się go przezNumber.isNaN(x). - Czym
letróżni się odvar?Poprawna odpowiedź:
letma zasięg bloku{},var- funkcjivarzadeklarowany wewnątrziflubforjest widoczny w całej funkcji. Ponadtovarjest hoistowany z wartościąundefinedi na najwyższym poziomie staje się właściwościąwindow, aleticonstdo momentu deklaracji są w „martwej strefie czasowej”.
JavaScript · Middle
- Czym różnią się od siebie
call,applyibind?Poprawna odpowiedź:
call/applywywołują od razu,bindzwraca nową funkcjęfn.call(ctx, a, b)ifn.apply(ctx, [a, b])wywołują od razu z podanymthis.fn.bind(ctx, a)zwraca funkcję z na stałe przypiętym kontekstem i częściowo zastosowanymi argumentami. Żadna z nich nie wpływa na funkcje strzałkowe: nie mają one własnegothis. - Jak silnik szuka właściwości, której sam obiekt nie ma?
Poprawna odpowiedź: Idzie w górę łańcucha prototypów, aż znajdzie właściwość lub dojdzie do
nullKażdy obiekt ma ukryty link
[[Prototype]](Object.getPrototypeOf). Tak tablice dostająmapzArray.prototype, a wszystkie obiektytoStringzObject.prototype. Przeszukiwanie zakresów dotyczy zmiennych, a nie właściwości. - Co robi
Object.create(proto)?Poprawna odpowiedź: Tworzy nowy pusty obiekt, którego prototypem jest
protoWłaściwości
protonie są kopiowane - są dostępne przez łańcuch prototypów.Object.create(null)tworzy obiekt w ogóle bez prototypu: wygodny „czysty” słownik bez dziedziczonych kluczy typutoString. - Czym naprawdę są klasy w JavaScript?
Poprawna odpowiedź: Składnią na dziedziczeniu prototypowym z kilkoma dodatkowymi sprawdzeniami
Metody klasy trafiają do
Class.prototype, aextendsbuduje łańcuch prototypów. Są jednak różnice wobec funkcji-konstruktorów: klasy nie można wywołać beznew, jej ciało działa w trybie ścisłym, metody są niewyliczalne, są prywatne pola#xistatic.
JavaScript · Senior
- Jak event loop przetwarza zadania w przeglądarce?
Poprawna odpowiedź: Jedno makrozadanie, potem cała kolejka mikrozadań, potem ewentualne renderowanie
Po każdym makrozadaniu (skrypt, zdarzenie, timer) kolejka mikrozadań jest opróżniana do końca, łącznie z mikrozadaniami dodanymi po drodze. Potem przeglądarka może zaktualizować renderowanie (wywołując
requestAnimationFrame), jeśli przyszła pora na klatkę. Dlatego długi łańcuch mikrozadań również blokuje renderowanie. - Jak globalnie śledzić nieobsłużone odrzucenia promise'ów w przeglądarce?
Poprawna odpowiedź: Zdarzeniem
unhandledrejectionnawindowwindow.addEventListener('unhandledrejection', e => report(e.reason))to standardowy sposób wysyłania takich błędów do monitoringu. Synchroniczne nieobsłużone błędy łapie zdarzenieerrornawindow. MetodyPromise.onErrornie ma. - Co robi
for await...of?Poprawna odpowiedź: Iteruje po asynchronicznym obiekcie iterowalnym, czekając na każdą wartość
Działa z obiektami, które mają
Symbol.asyncIterator: generatorami async, strumieniami (ReadableStream), paginacją API. Iteracje wykonują się sekwencyjnie. Do równoległego przetwarzania tablicy promise'ów użyjPromise.all. - Do czego służy
Proxy?Poprawna odpowiedź: Do przechwytywania operacji na obiekcie: odczytów, zapisów, usunięć
Pułapki (traps) takie jak
get,set,hasideletePropertypozwalają implementować reaktywność (tak działa Vue 3), walidację, logowanie i wartości domyślne.Reflectdaje domyślne zachowanie operacji do użycia wewnątrz pułapek.
Testy łączone z tym tematem
Pytania z kilku tematów naraz - jak na rozmowie rekrutacyjnej na konkretne stanowisko.
Zadania z kodu
Napisz rozwiązanie prosto w przeglądarce, a testy od razu je sprawdzą. Klasyka rozmów rekrutacyjnych: debounce, throttle, deepClone, Promise.all, EventEmitter, cache LRU i inne.
Otwórz zadania →