Вопросы по JavaScript
Типы, замыкания, this, прототипы, event loop и промисы: всё, на чём строится техническая часть любого фронтенд- и Node-собеса. После трека вы уверенно читаете хитрый код и объясняете, почему он работает именно так.
Проверьте себя: тест по JavaScript
20 вопросов, 10 минут, уровень junior, middle или senior
Типы и приведение
Восемь типов, typeof, == и ===, правила приведения и ловушки сравнения.
Урок: Типы и приведение за 7 минут 7 мин- Смешивание BigInt и Number
- Какое значение истинно
- Ложные значения
- Number.MAX_SAFE_INTEGER
- Object.is и его отличие от ===
- Примитивные типы JavaScript
- isNaN против Number.isNaN
- Минус и умножение со строками
Ещё 25 вопросов и задач
- Зачем пишут x == null
- null >= 0 при null == 0 равном false
- valueOf и toString при приведении объекта
- Массивы в арифметике
- Булево в нестрогом сравнении
- Приведение к числу: пробелы, null, undefined
- Оператор запятая
- Предел точности целых
- Деньги и округление
- Сравнение строк
- typeof несуществующей переменной
- Сложение и приведение типов
- Сравнение с приведением типов
- typeof и instanceof
- Унарный плюс и приведение
- Числа с плавающей точкой
- Строки неизменяемы
- Ложные значения
- Сложение числа и строки слева направо
- == против ===
- Как надёжно определить тип значения
- Неявное приведение типов в JavaScript
- Разница между == и ===
- Сравнение строк с числами через <
- Что возвращает typeof null
Области видимости и замыкания
var, let, const, hoisting, TDZ и как функция запоминает своё окружение.
Урок: Области видимости и замыкания за 7 минут 7 мин- Что такое замыкание
- Замыкание и память
- Замыкание и глобальная переменная с тем же именем
- Можно ли менять объект в const
- Замыкание
- Hoisting (поднятие)
- Лексическая область видимости
- Временная мёртвая зона (TDZ)
Ещё 28 вопросов и задач
- Зачем нужна IIFE
- Почему let в цикле чинит setTimeout
- Повторное объявление let
- Замыкание видит изменения после создания
- Где объявлена, а не где вызвана
- Функция once на замыкании
- var и function с одним именем
- Замыкание в массиве функций
- Немедленно вызываемая функция
- Общее замыкание
- Поднятие функции
- hoisting var
- Временная мёртвая зона
- Область видимости var в блоке
- Что такое замыкание
- Всплытие и TDZ
- Строгий режим
- Объясните замыкание на примере
- Чем отличаются var, let и const
- Счётчик в setInterval застревает на 1
- typeof в временной мёртвой зоне
- var и let на верхнем уровне скрипта
- var с именем параметра функции
- Аргументы, замыкание и внешняя переменная
- Замыкание в цикле while
- Три способа объявить функцию
- Затенение в блоке
- Замыкание в while с постдекрементом
this, call, apply, bind
Четыре правила определения this, стрелки и потеря контекста.
Урок: this, call, apply, bind за 6 минут 6 мин- Стрелка как метод объекта
- Повторный bind
- Примитив в качестве this
- Разница между call и apply
- Поле-стрелка против метода класса
- this в стрелочной функции
- Что делает bind
- call и apply
Ещё 22 вопроса и задачи
- Правила определения this
- Второй аргумент forEach
- new против bind
- call не меняет this стрелки
- Одолженный метод со стрелкой внутри
- Привязанная функция как метод
- new на привязанной функции и call
- Потеря this при деструктуризации
- this во вложенной функции
- Потеря this у метода класса
- this в стрелке
- Оторванный метод
- Как определяется this
- Как реализовать свой bind
- Как определяется this
- От чего зависит this
- this в обработчике при делегировании
- Метод класса в setTimeout
- this при обычном вызове в строгом режиме
- Потеря контекста у логгера
- this в стрелке внутри IIFE
- Копирование методов в другой объект
Прототипы и классы
Цепочка прототипов, new, class, extends, super и приватные поля.
Урок: Прототипы и классы за 8 минут 8 мин- Вызов класса без new
- Как работает instanceof
- Что делает оператор new
- Приватные поля класса
- Цепочка прототипов
- for...in по экземпляру класса
- Object.hasOwn против оператора in
- Метод в прототипе или в конструкторе
Ещё 22 вопроса и задачи
- Конструктор возвращает объект
- Объект без прототипа
- Поле наследника во время конструктора родителя
- instanceof после замены prototype
- Затенение метода прототипа и delete
- Массив в прототипе общий для всех
- Статические поля
- Геттеры и сеттеры
- Порядок в конструкторе
- Прототип
- Обращение к приватному полю снаружи
- __proto__ против prototype
- Как ищется свойство объекта
- Прототипное наследование
- Класс против функции-конструктора
- Прототипное наследование
- Статический метод и наследник
- this до вызова super
- Number.prototype.times
- Объект без прототипа
- Расширение Array исключением по индексам
- Цепочка plus на числах
Функции высшего порядка
Функции как значения, композиция, каррирование, мемоизация, чистота.
Урок: Функции высшего порядка за 6 минут 6 мин- Ограничения стрелочных функций
- Порядок применения в compose
- Каррирование против частичного применения
- Debounce или throttle для поиска
- Значение по умолчанию вычисляется на каждый вызов
- Каррирование
- Функция высшего порядка
- Мемоизация
Ещё 16 вопросов и задач
- Чистая функция
- fn.length и параметры по умолчанию
- Что такое функция высшего порядка
- map(parseInt)
- Ошибка в ключе мемоизации
- Дефолты и деструктуризация
- Прерывание вложенных циклов
- Параметр по умолчанию
- Порядок вычисления аргументов
- arguments и стрелка
- Какая функция чистая
- Каррирование и частичное применение
- Debounce против throttle
- reduce без начального значения и тип аккумулятора
- Каррирование и частичное применение
- Функции высшего порядка на практике
Объекты и массивы
Ссылки и копирование, методы массивов, мутирующие и новые неизменяемые версии.
Урок: Объекты и массивы за 7 минут 7 мин- Какой метод не меняет массив
- Array.of против new Array
- every и some на пустом массиве
- Мутирующие методы массива
- Object.freeze
- Поверхностная и глубокая копия
- structuredClone
- return внутри forEach
Ещё 35 вопросов и задач
- Object.freeze и вложенный объект
- includes и indexOf с NaN
- Дата после копирования через JSON
- Дыры в массиве
- Сравнение объектов
- Array.from со вторым аргументом
- Присваивание length
- Методы и дыры
- Стабильность сортировки
- delete в массиве
- toJSON и replacer
- Мутация через ссылку
- Спред и аксессоры
- structuredClone
- JSON и undefined
- Ключи Map и объекта
- sort мутирует
- Порядок ключей объекта
- reduce без начального значения
- Set и объекты
- sort без компаратора
- Спред копирует поверхностно
- Методы массива
- Копирование объектов
- Зачем неизменяемость
- push в массив состояния React
- Object.seal против Object.freeze
- Компаратор для сортировки по убыванию
- Как скопировать объект
- Неизменяемое обновление данных
- Что не умеет structuredClone
- Присваивание за границей массива
- Спред и вложенный объект
- Порядок аргументов Object.assign
- Передача по значению и по ссылке
Современный синтаксис
Деструктуризация, spread, ?. и ??, Map и Set, новинки ES2022-ES2025.
Урок: Современный синтаксис за 8 минут 8 мин- Array.prototype.with за границей массива
- Деструктуризация null
- Map против объекта
- ?? против ||
- Опциональная цепочка
- Symbol
- Громкость 0 превращается в 50
- ?? вместе с || без скобок
Ещё 22 вопроса и задачи
- Объекты как ключи обычного объекта
- Короткое замыкание опциональной цепочки
- Object.groupBy и объект без прототипа
- toSorted, with и at
- Логическое присваивание и ленивое вычисление
- Новые методы Set
- Опциональный вызов
- Proxy
- Глобальная регулярка хранит состояние
- Символы как ключи
- Опциональная цепочка
- Promise.withResolvers
- Map против объекта
- Опциональная цепочка и нулевое слияние
- Proxy и Reflect
- Регулярные выражения
- Symbol
- Map, Set, WeakMap и WeakSet
- Какие новые возможности JS вы используете
- undefined в spread перезаписывает дефолт
- Symbol и Symbol.for
- Когда нужен WeakMap
Event loop
Стек вызовов, микро- и макрозадачи, порядок вывода и рендер.
Урок: Event loop за 7 минут 7 мин- Блокирует ли await поток
- Как дать браузеру отрисовать прогресс
- Что выполняется после синхронного кода
- Event loop
- Задачи (макрозадачи)
- Микрозадачи
- requestAnimationFrame
- Долгая задача в главном потоке
Ещё 26 вопросов и задач
- Бесконечные микрозадачи против таймеров
- setImmediate и setTimeout внутри колбэка ввода-вывода
- Каждый await это один шаг микрозадач
- Синхронный executor и await готового промиса
- Микрозадача между двумя таймерами
- async/await и порядок
- Вложенные микрозадачи
- Смешанная очередь
- let в цикле с setTimeout
- var в цикле с setTimeout
- Микро- и макрозадачи
- Таймер с нулём
- Event loop
- Порядок микро- и макрозадач
- Таймеры
- requestAnimationFrame против setInterval
- Почему элемент так и не показался
- Что на самом деле значит setTimeout(fn, 0)
- Объясните event loop
- Тяжёлые вычисления без зависания интерфейса
- Что верно про Web Worker
- Что попадает в очередь микрозадач
- Порядок логов в смешанной очереди
- Инкремент внутри таймера
- Вложенные таймеры и промисы
- Рекурсивная микрозадача
Промисы и async/await
Состояния промиса, цепочки, комбинаторы, ошибки и параллельность.
Урок: Промисы и async/await за 8 минут 8 мин- Как отменить fetch
- Что возвращает async-функция
- AbortController
- async/await
- Комбинаторы промисов
- Промис и его состояния
- Цепочка: забытый return, finally и восстановление
- all, allSettled и any на одних данных
Ещё 28 вопросов и задач
- race не отменяет проигравших
- Повторные resolve, reject и throw
- Ошибка в async-функции
- await внутри forEach
- Возврат из async
- try/catch и асинхронность
- finally не меняет значение
- catch возвращает значение
- Цепочка then
- Что с остальными запросами при ошибке в Promise.all
- Первый успешный ответ из нескольких зеркал
- Состояния промиса
- Отмена запроса
- async/await
- Промис: состояния и гарантии
- Комбинаторы промисов
- Гонки в интерфейсе
- Повтор запроса и backoff
- return без await внутри try
- Последовательные await и время выполнения
- Обработка ошибок в асинхронном коде
- Колбэки, промисы и async/await
- Забытый return в цепочке
- Что возвращает then
- Исключение в таймере внутри промиса
- Необработанное отклонение в Node.js
- Две цепочки от одного отклонённого промиса
- Порядок в двух цепочках
Ошибки
try/catch/finally, свои классы ошибок, cause, асинхронные и необработанные ошибки.
Урок: Ошибки за 6 минут 6 мин- Какой catch написан правильно
- Зачем this.name в своём классе ошибки
- Что не ловит Error Boundary в React
- Как обернуть ошибку, сохранив исходную
- Чтение свойства у null
- return в finally глотает ошибку
- Error.cause
- TypeError и ReferenceError
Ещё 11 вопросов и задач
Итераторы и генераторы
Протокол итерации, function*, yield, ленивые последовательности и for await.
Урок: Итераторы и генераторы за 7 минут 7 мин- Асинхронный генератор в обычном for...of
- for await...of
- Генератор
- Итерируемый объект и итератор
- yield*
- for...in против for...of на массиве
- for...of по обычному объекту
- Вызов функции-генератора
Ещё 16 вопросов и задач
- Зачем ленивые последовательности
- Почему второй цикл по генератору пуст
- Метод return у генератора
- return-значение генератора и повторный spread
- finally генератора при break
- Ленивый бесконечный генератор
- Передача значений в генератор через next
- for await
- Генератор
- Итераторы и генераторы
- Постраничная загрузка через асинхронный генератор
- Итераторы и генераторы
- Итерация строки с эмодзи
- Что делает объект итерируемым
- Генератор обхода вложенного массива
- Что делает yield*
Модули
ESM и CommonJS, live bindings, динамический import, циклические зависимости.
Урок: Модули за 7 минут 7 минПамять и сборка мусора
Достижимость, mark-and-sweep, типичные утечки, WeakMap и WeakRef.
Урок: Память и сборка мусора за 6 минут 6 мин- Снять все слушатели одним вызовом
- Замыкание держит большой объект
- Удалённые из DOM, но живые узлы
- Как найти утечку в DevTools
- Гарантии FinalizationRegistry
- Mark-and-sweep
- Типичные утечки памяти
- Достижимость
Ещё 11 вопросов и задач
- WeakMap и сборка мусора
- Циклические ссылки и сборщик мусора
- Утечка через setInterval в компоненте
- Освобождает ли x = null память
- WeakMap
- Утечки памяти во фронтенде
- Память SPA растёт со временем
- Сборка мусора и утечки памяти
- Зачем V8 делит кучу на поколения
- Map или WeakMap для кеша по объекту
- Что возвращает WeakRef.deref
Реализация с нуля
debounce, throttle, Promise.all, deepClone и другие классические задачи на live coding.
Урок: Реализация с нуля за 8 минут 8 мин- Отменяемая операция
- Склейка вызовов в пачку
- Композиция редьюсеров
- Шина событий с шаблонами
- Переводы с подстановкой и числом
- Неизменяемые операции над списком
- Двоичная куча
- Постраничная загрузка как итератор
Ещё 116 вопросов и задач
- Повтор с нарастающей паузой
- Сопоставление маршрута
- Семафор
- Префиксное дерево
- Валидация по схеме
- Обработка без блокировки потока
- classNames
- deepClone с циклами и типами
- Предохранитель
- Конструктор компараторов
- Контраст цветов
- Разбор и сборка CSV
- Вычисление флагов
- Клиент с перехватчиками
- Менеджер состояния формы
- Подсветка совпадений
- Очередь фоновых задач
- Мемоизация по объектным аргументам
- Деньги в копейках
- Реактивность через Proxy
- Шаблонизатор с циклами и условиями
- Относительное время
- Различия двух текстов по словам
- debounce + cancel + flush
- deepEqual
- deepFreeze
- EventEmitter
- Плоские пути объекта
- LRU-кэш
- Array.prototype.map своими руками
- Цепочка middleware
- Свой Promise
- Разница двух объектов
- Наблюдаемое значение
- Разбор и установка cookie
- Promise.any
- promisify
- Разбор и сборка query-строки
- Ограничитель частоты
- Array.prototype.reduce своими руками
- Воспроизводимый генератор
- Неизменяемое обновление по пути
- Применение различий к списку
- Минимальный стор
- throttle с leading/trailing
- Кэш с временем жизни
- Запросы с кэшем и дедупликацией
- История с отменой
- Видимые элементы виртуального списка
- debounce со стрелкой вместо function
- debounce без clearTimeout
- deepClone падает на циклической ссылке
- once ломает emit в EventEmitter
- Свой call без call и apply
- debounce и throttle
- Циклические ссылки в deepClone
- Ключевые моменты своего Promise.all
- pool
- promiseAll
- curry
- Ошибка порядка в своём Promise.all
- Реализация Promise.race
- Реализуйте Promise.all
- Как вы решаете задачу на live coding
- Сложение через удалённый вызов
- Ограничение времени выполнения
- retryFetch с условиями
- Колбэк в промис и повторы
- Поиск по имени файла
- Наибольшее число из цифр
- Дерево файлов: родитель объявлен позже
- Убрать подряд идущие повторы букв
- throttle с контекстом и последним вызовом
- Слова по столбцам
- camelCase в snake_case
- Сжатие диапазонов
- Сумма промисов
- Калькулятор цепочкой
- Пространство имён из строки
- filter своими руками
- Геттер и сеттер полного имени
- Увеличить число в конце строки
- Натуральная сортировка
- Треугольник Паскаля
- Римские цифры в число
- Сложение больших чисел строками
- Преобразование по чётности
- Сложение цепочкой вызовов
- Младший, старший и разница
- Строка с забоями
- Сколько пирожных можно испечь
- Буквы города звёздочками
- Частоты символов парами
- Сжатие строки без учёта регистра
- Циклический сдвиг в обе стороны
- Делящиеся в диапазоне
- Чётные символы с проверкой длины
- Приз за ставку на матч
- Горка из решёток
- Склейка с разделителем
- Максимум по чётным индексам
- Наибольшее число из цифр (с приведением типов)
- Максимальное число одинаковых
- Зеркальные ключи
- Гласные в конец
- Список имён с амперсандом
- Сколько нечётных меньше n
- Восстановить строку по индексам
- Меньшая, большая, меньшая
- Выбор баннеров по весу
- Нарушения возрастающей последовательности
- Стабильное разделение по порогу
- Сумма двух наименьших
- Журнал остановок в пути
- Уникальные без Set и Map
- Шифр гласных цифрами
Разминка: короткие функции
Короткие функции на массивы и строки, чтобы разогнать руки перед задачами.
Урок: Короткие функции: идиомы за 6 минут 6 мин- Array.from({ length })
- Сортировка строк по-русски
- Мутировать вход или нет
- Set вместо includes
- Сложность пересечения через includes
- nth
- average
- sortedIndex
Ещё 233 вопроса и задачи
- chunk
- compact
- countBy
- uniqueBy
- firstDiff
- difference
- allPositive
- matrix
- findLast
- wordsOf
- flattenDeep
- flattenOne
- frequencies
- groupBy
- modeOf
- findById
- indexOfMin
- insertAt
- intersection
- last
- maxOf
- maxBy
- move
- pairs
- partition
- range
- removeAt
- replaceAt
- rotate
- rotateMatrix
- shuffle
- sortBy
- sortByTwo
- sortNumbers
- sum
- sumBy
- sumNested
- takeWhile
- transpose
- unique
- updateById
- zip
- zipObject
- allSettled
- chain
- debounce
- delay
- firstSuccess
- mapLimit
- onceAsync
- runParallel
- poll
- retry
- runSequential
- orderOfCompletion
- sleep
- throttle
- withTimeout
- Stack
- sleepAbortable
- after
- settleAll
- hasFlag
- extraChar
- splitBy
- commonPrefix
- compactObject
- countIf
- countLeaves
- countSubstring
- debounceLeading
- withDefaultArgs
- createDeferred
- escapeHtml
- filterObject
- flattenDepth
- flip
- isPlainObject
- inRange
- indexBy
- isLeapYear
- mapValues
- memoizeAll
- shallowEqual
- plural
- parseDuration
- pickPaths
- pipeAsync
- createQueue
- firstToFinish
- toRanges
- reverseWords
- sample
- slugify
- withoutValue
- startOfDay
- trimChar
- sumMatrix
- swapInPlace
- tap
- throttleTrailing
- withFallback
- unary
- zipLongest
- daysBetween
- formatDate
- addDays
- allOf
- averageOf
- camelToWords
- cartesian
- chunkWhile
- atSafe
- charFrequency
- countSubarray
- debouncePromise
- dedupeAdjacent
- arraysEqual
- deepKeys
- digitalRoot
- sortedEntries
- wrapError
- chunksOf
- rangeGen
- uniqueGen
- groupToMap
- ownKeysOnly
- interleave
- invertToArrays
- looksLikeEmail
- lastIndexWhere
- lerp
- mergeMaps
- maskCard
- maxKey
- minMax
- createMultiMap
- parseVersion
- toQuery
- partial
- percentChange
- chainValue
- firstIndexToSettle
- replaceTokens
- attempt
- reverseEachWord
- rotateLeft
- roundHalfUp
- safeJson
- isSameDay
- runWithGap
- splitInto
- splitKeep
- splitByLength
- sumRange
- sumValues
- slugToTitle
- toBinary
- activeKeys
- randomId
- startOfWeek
- wrapText
- ValidationError
- myBind
- compose
- makeCounter
- curry2
- limitCalls
- memoize
- negate
- constant
- once
- pipe
- spy
- take
- makeRange
- groupCount
- mapToObject
- formatBytes
- clamp
- formatPrice
- gcd
- sumDigits
- isPrime
- randomInt
- roundTo
- percent
- deepClone
- withDefaults
- topKeys
- get
- invert
- isEmpty
- mergeDeep
- omit
- hasPath
- pick
- renameKeys
- setPath
- extractNumbers
- parseDate
- symmetricDiff
- isSuperset
- union
- isAnagram
- shiftLetters
- toCamel
- capitalize
- toCodes
- compress
- countChar
- initials
- isPalindrome
- toKebab
- longestWord
- maskEmail
- squish
- padLeft
- isRepeated
- reverseStr
- interpolate
- titleCase
- truncate
- countVowels
- wordFreq
- wordCount
- Сортировка по двум полям
- Spread в аккумуляторе reduce
- Разворот строки с эмодзи
- Функция top3 портит входной массив
- Как убрать дубли из массива
- Как проверить короткое решение
- uniqueBy через Map: кто останется