Frontend
JavaScript #
Значения, ссылки и память #
Junior #
Что такое shallow copy и deep copy?
|
Shallow copy создает новый верхний объект, но вложенные объекты остаются общими. Deep copy рекурсивно создает независимые вложенные значения. Полное копирование может быть дорогим и не всегда имеет смысл для immutable updates. |
Middle #
Чем примитивы отличаются от объектов?
|
Примитивы — |
Что значит "передача по значению" в JavaScript?
|
При вызове функции параметр получает копию значения аргумента. Для примитива копируется сам примитив, для объекта — значение ссылки на объект. Переназначение параметра не меняет внешнюю переменную. |
Передаются ли объекты по ссылке в JavaScript?
|
Точнее говорить: объекты тоже передаются по значению, но этим значением является ссылка на объект. Функция и вызывающий код получают две копии ссылки на один объект. Поэтому мутация объекта видна снаружи, а переназначение параметра — нет. |
Чем отличается ссылка на объект от самого объекта?
|
Объект содержит состояние в памяти, а ссылка позволяет найти конкретный объект. Несколько переменных могут содержать ссылки на один объект. Изменение через любую из них будет наблюдаться через остальные. |
Почему изменение свойства объекта внутри функции видно снаружи?
|
Скопированная ссылка параметра указывает на тот же объект, что и внешняя переменная. Запись свойства меняет этот общий объект. Новый объект при этом не создается. |
Почему переназначение параметра внутри функции не меняет внешнюю переменную?
|
Параметр — локальная переменная функции. Присваивание заменяет только локальную копию ссылки, а внешняя переменная продолжает указывать на прежний объект.
|
Как работает сравнение объектов через ===?
|
|
Чем отличаются spread, Object.assign и structuredClone?
|
Spread и |
Какие ограничения есть у JSON.parse(JSON.stringify(...)) для deep copy?
|
Метод теряет |
Типы, функции и область видимости #
Junior #
Что такое область видимости в JS?
|
Область видимости в JavaScript — это правило, которое определяет, где переменная, функция или класс доступны в коде.
Основные виды scope в JS
Доступно везде в файле/программе:
var виден внутри всей функции:
let и const видны только внутри блока {}:
В ES-модулях переменные не попадают в global scope:
|
Middle #
Какие типы данных есть в JavaScript?
|
В JavaScript есть семь примитивных типов: Все остальные значения относятся к типу
Важно:
|
В чем разница между call и apply, bind в JS?
|
call и apply делают одно и то же: вызывают функцию с явно заданным this. call Аргументы передаются через запятую:
bind тоже работает с this, но не вызывает функцию сразу. Он создает новую функцию, у которой this уже заранее привязан.
call — вызывает сразу. apply — вызывает сразу, но аргументы массивом. bind — НЕ вызывает сразу
|
В чем отличие нативных (Native) объектов от хост-объектов (Host objects)?
|
Нативные объекты — часть спецификации языка. Они доступны нам вне зависимости от того, на каком клиенте исполняется наш код. Примеры: Array, Date и Math. Полный список нативных объектов.
Встроенные (Built-in): Array, Date, Math, String, Promise, Object. Пользовательские: Объекты, создаваемые вами через new Object(), литералы {} или классы. Контекстные: Объект globalThis (или window в браузере, global в Node.js), Math и JSON. Хост-объекты (Host objects) Это объекты, предоставляемые средой выполнения (окружением), в которой запущен JavaScript (браузер, сервер Node.js и т.д.). Они не являются частью самого языка, зависят от платформы и могут различаться. В браузере: window, document, location, history, XMLHTTPRequest, fetch, элементы DOM, localStorage. В Node.js: Объекты для работы с файловой системой (fs), процессами (process), операционной системой (os). |
Массивы, объекты и даты #
Junior #
Что такое Object.fromEntries?
|
Пример фильтрации свойств:
|
Что такое Array.prototype.reduce?
|
Initial value стоит задавать явно, особенно если массив может быть пустым:
Не стоит использовать |
Что такое sparse array?
|
Sparse array, разреженный массив, содержит пустые слоты, в которых нет свойства с соответствующим индексом. Это не то же
самое, что явное значение
Методы ведут себя по-разному: |
Что такое ISO-формат даты?
|
ISO 8601 - распространенный стандарт записи даты и времени. В JavaScript часто встречается формат
|
Middle #
Что такое Object.groupBy и когда его использовать?
|
|
Чем Object.groupBy отличается от Map.groupBy?
|
Выбор зависит от того, какие ключи нужны и будет ли результат дальше использоваться как объект или |
Что делает Object.hasOwn?
|
В отличие от |
Чем Object.hasOwn отличается от оператора in?
|
|
Чем Object.entries отличается от Object.fromEntries?
|
Symbols не попадают в |
Что возвращает Object.keys и в каком порядке?
|
Integer-like ключи идут по возрастанию, остальные строковые ключи - в порядке добавления:
Порядок определен спецификацией, но бизнес-логику сортировки лучше выражать явно, а не связывать со способом хранения объекта. |
Чем flat отличается от flatMap?
|
|
Когда использовать flatMap вместо map().flat()?
|
|
Чем toSorted отличается от sort?
|
Для чисел нужен comparator, иначе значения сортируются как строки. |
Чем reverse отличается от toReversed?
|
|
Чем splice отличается от toSpliced?
|
|
Что делает array.with?
|
Недопустимый индекс приводит к |
Почему immutable-методы массивов полезны в Angular?
|
Мутация массива на месте может не создать ожидаемого реактивного обновления и усложняет сравнение предыдущего и нового состояния. |
Какие базовые API есть у Date?
|
|
Что делает Date.prototype.toISOString?
|
Метод удобен для API, логов, сериализации и приведения моментов времени к единому формату. |
Какие ошибки часто допускают при работе с Date?
Для более сложной работы с датами развивается |
Как сравнивать даты в JavaScript?
|
Моменты времени удобно сравнивать по timestamp через
Для API моменты времени обычно передают в ISO/UTC. Если значение является календарной датой без времени, например днем
рождения, его часто безопаснее хранить отдельной строкой |
Promise и асинхронность #
Junior #
Что такое Promise.try?
|
API удобно на границе, где callback может быть синхронным или асинхронным. Это новый стандартный метод, поэтому перед использованием нужно проверить поддержку целевых browsers и runtime. |
Middle #
Чем Promise.all отличается от Promise.allSettled?
|
|
Что произойдет при ошибке внутри Promise.all?
|
Итоговый promise отклонится с причиной первого обнаруженного rejection. Остальные запущенные операции автоматически не отменяются и могут продолжить работу. Если допустим частичный результат, используют |
Когда использовать Promise.race?
|
Важно: проигравшие операции автоматически не отменяются. |
Middle+ or Senior #
Чем Promise.any отличается от Promise.race?
|
|
Что такое Promise.withResolvers?
|
Метод удобен при адаптации callback/event API, но внешнее управление promise усложняет жизненный цикл. Для обычной
последовательной логики чаще проще |
URL и query params #
Junior #
Что такое URL и URLSearchParams?
|
Это безопаснее и понятнее ручной конкатенации query string. |
Как добавлять, изменять и удалять query parameters?
|
Middle #
Чем URLSearchParams.append отличается от set?
|
Для multi-value параметров используют |
Отмена асинхронных операций #
Junior #
Что такое AbortController и AbortSignal?
|
Один signal можно передать нескольким связанным операциям. |
Middle #
Как сделать timeout для fetch?
|
Современный вариант использует
Если нужен ручной контроль, создают
|
Чем отмена запроса отличается от игнорирования результата?
|
Игнорирование результата не останавливает сетевую работу и обработку ответа. Настоящая отмена через В Angular это встречается в autocomplete, навигации между страницами и уничтожении компонентов. |
HTTP и REST #
Junior #
Что такое REST?
|
REST (Representational State Transfer) — это набор правил и принципов для построения взаимодействия между программами (клиентом и сервером) через интернет. Обычно клиент (например, браузер или мобильное приложение) запрашивает данные у сервера, а тот их возвращает, чаще всего по протоколу HTTP. Ключевые принципы REST Клиент-серверная модель:
|
Middle #
Что было до REST и после?
|
REST (Representational State Transfer) — это набор правил и принципов для построения взаимодействия между программами (клиентом и сервером) через интернет. Обычно клиент (например, браузер или мобильное приложение) запрашивает данные у сервера, а тот их возвращает, чаще всего по протоколу HTTP. Ключевые принципы REST Клиент-серверная модель:
Идея: клиент вызывает удаленную функцию как обычную функцию.
На уровне сети это превращалось в запрос к серверу. Минус: клиент часто сильно завязан на серверные методы. То есть API выглядит как набор команд.
SOAP — более формальный XML-based подход.
Особенности:
Минус: тяжеловесно, много boilerplate.
REST стал популярным как более простой HTTP-подход.
Появляется ресурс:
Вместо:
REST-стиль:
Главная идея REST: API строится вокруг ресурсов, а HTTP-методы описывают действие. REST никуда не исчез. Он до сих пор основной стандарт для обычных web API. Но рядом появились другие подходы.
Идея: клиент сам говорит, какие поля ему нужны.
Плюсы:
Минусы:
Хорошо подходит, когда UI сложный и REST начинает плодить много endpoint-ов.
Идея: быстрые типизированные контракты между сервисами. Обычно используется не browser ↔ backend, а backend ↔ backend.
Плюсы:
Минусы:
|
DOM, SSR и hydration #
Middle+ or Senior #
Что такое hydration в JavaScript?
|
Hydration — это процесс, при котором JavaScript подключает интерактивное поведение к уже существующей HTML-разметке, обычно полученной с сервера через SSR или prerender. Браузер сначала показывает готовый HTML, а затем клиентский код находит нужные DOM-узлы, восстанавливает состояние и навешивает обработчики событий. Упрощенный пример:
До выполнения скрипта кнопка уже видна пользователю, но еще не интерактивна. После hydration обработчик Главное требование — клиентский код должен ожидать такую же начальную разметку, какую отдал сервер. Если сервер
отрендерил |
Event Loop #
Middle+ or Senior #
Чем отличается queueMicrotask от setTimeout?
Вывод:
|
Что такое Event loop?
|
JavaScript в браузере выполняется в основном в одном потоке. Поэтому ему нужен диспетчер, который по очереди обрабатывает:
|
Расширенные основы JavaScript #
Junior #
Что такое this и расскажите про область видимости?
|
Область видимости определяет, где доступна переменная. В JavaScript есть глобальная, модульная, функциональная и блочная
область видимости.
Нельзя определять |
Что такое Promise и для чего используется в JS?
|
Обработчики Для параллельной работы есть |
Что такое макро и микро задачи в JS?
|
Термин task часто неформально называют macrotask.
После завершения текущей task движок полностью очищает очередь microtasks и только затем может выполнить рендер и перейти к следующей task. Если microtasks непрерывно добавляют новые microtasks, они могут задержать рендер и обработку событий. Поэтому тяжелую
работу нельзя бесконечно дробить только через Promise или |
Что такое класс и интерфейс?
|
Класс описывает создание объектов, их состояние и поведение. Класс существует во время выполнения JavaScript. Интерфейс TypeScript описывает контракт формы значения и используется только при проверке типов. После компиляции интерфейс исчезает.
Интерфейс нельзя напрямую использовать как Angular DI-токен, потому что его нет в runtime. Для DI используют класс,
|
Что такое конструктор класса?
|
Конструктор — специальный метод, который выполняется при создании экземпляра через
В производном классе до обращения к В Angular конструктор класса не является lifecycle hook. Для компонентов он должен оставаться простым: DI и базовая инициализация выполняются в конструкторе, а логика, зависящая от входных данных, размещается в соответствующем lifecycle hook или реактивной модели. |
Middle #
В чем отличие var от const, let?
По умолчанию используют |
Как устроено прототипное наследование в JavaScript?
|
Каждый обычный объект может иметь внутреннюю ссылку
Синтаксис Слишком глубокие и изменяемые цепочки усложняют код. В прикладной разработке часто предпочитают композицию небольших объектов наследованию. |
Почему Set.has часто лучше Array.includes для частых проверок?
|
Для одного короткого списка |
Когда Map лучше обычного объекта?
|
Обычный объект удобен для JSON-like данных и фиксированной формы:
В Angular-состоянии часто хранят и |
Какие ошибки часто бывают в comparator для sort?
|
Comparator должен возвращать отрицательное число, ноль или положительное число и быть согласованным. Частые ошибки: возвращать boolean, мутировать элементы, зависеть от внешнего меняющегося состояния, забывать числовой comparator или не обрабатывать равенство.
Для строк лучше использовать |
Почему string.length в JavaScript не всегда равен количеству видимых символов?
|
Даже code point не всегда равен видимому символу: один grapheme cluster может состоять из нескольких code points.
Поэтому обрезка пользовательского имени, textarea limit или preview текста должны учитывать Unicode, если продукт
работает с emoji и разными языками. Для пользовательских символов можно использовать |
Почему 0.1 + 0.2 !== 0.3?
|
JavaScript
Для отображения используют округление, например
|
Какие ограничения есть у bitwise operators в JavaScript?
|
Bitwise operators приводят значения к 32-bit signed integer, кроме
Битовые операции уместны для flags, binary protocols, canvas/image processing и TypedArray. Для обычного UI-кода
читаемая структура вроде |
Middle+ or Senior #
Как устроена память в JavaScript (memory heap, memory stack)?
|
Упрощенная модель состоит из call stack и heap:
Сборщик мусора освобождает объекты, которые больше недостижимы от корней приложения. Основная идея современных сборщиков мусора — mark and sweep. Типичные причины утечек: забытые подписки и обработчики, бесконечно растущий кеш, таймеры, замыкания и ссылки на
удаленные DOM-узлы. В Angular для подписок можно использовать |
Что такое call-stack, task-queue (приведите примеры работы)?
|
Call stack хранит активные вызовы функций. JavaScript выполняет верхний frame стека и снимает его после возврата из функции. Task queue содержит готовые к выполнению задачи: таймеры, DOM-события и другие callbacks. Event loop передает следующую задачу в стек, когда стек пуст и обработаны microtasks.
Порядок вывода: |
Почему event loop не спасает от плохой алгоритмической сложности?
|
Event loop умеет чередовать задачи, но синхронный JavaScript все равно выполняется на main thread до завершения текущей task. Если обработчик клика сортирует, фильтрует и рендерит огромный список за сотни миллисекунд, браузер не сможет обработать input и paint посередине этой работы. Решения зависят от причины: улучшить алгоритм, заранее построить индекс через |
JavaScript interview questions #
Junior #
Что такое event delegation?
|
Event delegation — это прием, при котором обработчик события ставят на общего родителя, а не на каждый дочерний элемент.
Событие всплывает вверх по DOM, а обработчик определяет исходный элемент через
|
Как работает prototypal inheritance?
|
Объект имеет internal prototype, по которому JavaScript ищет свойство, если его нет на самом объекте. Этот поиск идет по
prototype chain до |
Что такое closure и когда она полезна?
|
Closure возникает, когда функция сохраняет доступ к переменным внешней lexical scope после завершения внешней функции. Она полезна для callbacks, factories, инкапсуляции состояния и partial application. Нужно помнить, что closure удерживает ссылки на значения и может продлить их жизнь в памяти. |
Что такое hoisting?
|
Hoisting — поведение, при котором declarations обрабатываются до выполнения кода в scope. Function declarations доступны
до объявления, |
Что такое type coercion?
|
Type coercion — неявное или явное преобразование значения к другому типу. JavaScript делает это в арифметике, сравнениях, string concatenation и boolean context. Неявные правила бывают неожиданными, поэтому в application code лучше явно преобразовывать данные на границах. |
Что такое event bubbling?
|
Bubbling — фаза события, когда оно идет от target вверх по ancestors до document/window. На этом основан event
delegation. Обработчик должен проверять |
Что такое event capturing?
|
Capturing — фаза события до target, когда событие идет сверху вниз от window/document к целевому элементу. Обработчик
подключают через |
Что такое strict mode?
|
Strict mode включает более строгие правила JavaScript: запрещает часть неявных globals, меняет |
Что такое mutable и immutable objects?
|
Mutable object можно изменить на месте, сохранив ту же ссылку. Immutable-подход создает новое значение при изменении. В Angular immutability помогает predictable state, signals, OnPush/change detection и простое сравнение предыдущего и нового состояния. |
Что такое higher-order function?
|
Higher-order function принимает функцию как аргумент или возвращает функцию. Примеры: |
Что такое destructuring?
|
Destructuring извлекает значения из массива или объекта в переменные по структуре. Он удобен для параметров функции, DTO mapping и работы с tuples. Важно помнить про defaults и то, что destructuring не делает deep clone.
|
Что такое template literal?
|
Template literal — строка в backticks с interpolation через |
Что такое currying?
|
Currying превращает функцию от нескольких аргументов в цепочку функций по одному аргументу. Это удобно для частичного применения, factories и композиции. В обычном application code его стоит использовать там, где он реально делает вызовы понятнее, а не ради функционального стиля. |
Что такое Promise?
|
Promise представляет будущий результат asynchronous operation: pending, fulfilled или rejected. Он позволяет строить
цепочки через |
Middle #
Зачем команде нужны JavaScript principles?
|
JavaScript principles фиксируют базовые договоренности: как писать modules, работать с async code, обрабатывать ошибки, именовать функции, избегать side effects и организовывать shared utilities. Это уменьшает хаос в больших проектах и делает поведение кода предсказуемым для review, testing и production debugging. |
Когда проекту нужны polyfills или shims?
|
Polyfills нужны, когда приложение использует JavaScript-возможность или Web API, которых нет в целевых браузерах. Их список должен зависеть от browser support policy и реальной аналитики, а не добавляться на всякий случай. Лишние polyfills увеличивают bundle size и могут ухудшать startup performance. |
Почему third-party scripts нужно контролировать?
|
Third-party scripts влияют на performance, security, privacy и стабильность приложения. Analytics, maps, chats, A/B tools и widgets часто грузятся вне основного lifecycle приложения. Их нужно инвентаризировать, ограничивать, мониторить и по возможности загружать лениво или после согласия пользователя. |
Зачем команде договариваться о JavaScript commenting?
|
Комментарии должны объяснять причину решения, ограничение, invariant или важный edge case, а не очевидный синтаксис. Если код требует много комментариев, возможно, его стоит упростить. Для публичных API, shared utilities и сложной бизнес-логики полезны JSDoc или TSDoc, если они поддерживаются командным workflow. |
Что значит следовать JavaScript patterns?
|
Это значит использовать узнаваемые подходы к организации кода: modules, factories, observers, adapters, dependency injection, immutable updates и другие patterns. Pattern полезен, когда упрощает понимание и расширение кода. Если он добавляет только церемонию и не решает реальную проблему, maintainability ухудшается. |
Как работает this в JavaScript?
|
|
Как arrow function меняет поведение this?
|
Arrow function не имеет собственного |
Чем null, undefined и undeclared variable отличаются?
|
|
Какие способы итерации по массивам и объектам есть в JavaScript?
|
Для массивов используют |
Чем forEach() отличается от map()?
|
|
Когда использовать anonymous function?
|
Anonymous function уместна для короткого одноразового callback, когда имя не добавляет смысла. Для сложной логики, recursion, stack traces и тестирования лучше именованная функция. В review хороший критерий простой: понятно ли действие из окружающего кода без отдельного имени. |
Что происходит при вызове функции с new?
|
|
Чем function declaration отличается от function expression?
|
Function declaration поднимается целиком и доступна до места объявления. Function expression создается во время
выполнения выражения; если она присвоена |
Чем feature detection отличается от проверки user agent?
|
Feature detection проверяет наличие нужной возможности, например через |
Почему == может быть опасен?
|
|
Чем HTML attribute отличается от DOM property?
|
Attribute — текстовое значение в HTML-разметке, а DOM property — свойство объекта в памяти браузера. Некоторые значения
отражаются друг в друга, но не всегда одинаково: |
Почему не стоит расширять built-in prototypes?
|
Добавление методов в |
Какие плюсы и минусы у языков, которые компилируются в JavaScript?
|
TypeScript, Elm, ClojureScript и другие языки могут дать типы, иные модели архитектуры и tooling. Цена — build step, source maps, зависимость от компилятора и необходимость понимать итоговый JavaScript при debugging. Для Angular TypeScript является стандартным выбором, но runtime-поведение все равно определяется JavaScript и браузером. |
Какие плюсы и минусы у immutability?
|
Плюсы: проще reasoning, undo/redo, memoization, change detection и тестирование. Минусы: дополнительные allocations, копирование больших структур и необходимость дисциплины при вложенных обновлениях. На практике immutable updates часто сочетают с нормализованными данными и точечным controlled mutation внутри локального алгоритма. |
Чем synchronous и asynchronous functions отличаются?
|
Synchronous function выполняется до завершения в текущей task и блокирует следующий код. Asynchronous function планирует продолжение через Promise, callback, timer, event или stream, позволяя event loop выполнять другие задачи. Асинхронность не означает parallelism: CPU-heavy работа все равно может блокировать main thread. |
Можно ли изменить объект, объявленный через const?
|
|
Чем ES6 class отличается от ES5 constructor function?
|
ES6 |
Чем spread отличается от rest?
|
Spread раскладывает iterable или свойства объекта в месте вызова или создания значения: |
Как делить код между файлами?
|
В modern JavaScript используют ES modules: |
Для чего нужны static class members?
|
Static members принадлежат class constructor, а не instance. Их используют для factories, constants, cache, utility methods и metadata, которая относится к типу в целом. Важно не превращать static state в скрытое глобальное состояние, которое мешает тестам и SSR. |
Чем while отличается от do while?
|
|
Чем event.target отличается от event.currentTarget?
|
|
Чем preventDefault() отличается от stopPropagation()?
|
|
Middle+ or Senior #
Как выбирать JavaScript framework или library для проекта?
|
Framework или library выбирают по задаче, экосистеме, поддержке команды, долгосрочной maintainability, performance и стоимости миграции. Хороший ответ сравнивает не только developer experience, но и риски: lock-in, bundle size, тестируемость, accessibility, SSR и доступность специалистов. |
Чем call stack отличается от task queue?
|
Call stack хранит текущую цепочку синхронных вызовов. Task queue содержит задачи, которые event loop возьмет позже: timers, events, network callbacks. Promise callbacks попадают в microtask queue и выполняются после текущего stack перед следующей macrotask. |
JavaScript coding questions #
Middle+ or Senior #
Что вернет 10 + '20' и почему?
|
Выражение вернет строку |
Почему 0.1 + 0.2 === 0.3 возвращает false?
|
Десятичные дроби |
Реализуйте add(2, 5) и add(2)(5).
|
Функция может проверить, передан ли второй аргумент, и вернуть либо сумму, либо функцию, ожидающую второй операнд.
Такой пример проверяет closures, arity и аккуратное отношение к falsy values. |
Как развернуть строку через split, reverse, join и какие ограничения у такого подхода?
|
Базовый вариант:
Он работает для простых BMP-символов, но может ломать emoji, surrogate pairs и combining marks. Для пользовательского
текста лучше учитывать Unicode grapheme clusters, например через |
Что делает выражение window.foo || (window.foo = 'bar')?
|
Если |
Почему переменная из IIFE недоступна снаружи?
|
IIFE создает собственную function scope, поэтому переменные внутри нее не попадают во внешнюю область. До ES modules и
|
Что будет с foo.length после двух push?
|
Если |
Что произойдет в выражении foo.x = foo = {n: 2}?
|
Левая ссылка |
В каком порядке выведутся console.log, setTimeout и Promise.then?
Порядок: |
Чем отличаются promise chain с return, без return, с вызовом функции и с передачей функции?
|
Если |
Почему var a = b = 3 может создать implicit global?
|
Выражение читается как |
Почему return и объект на следующей строке могут сломаться из-за ASI?
|
Automatic Semicolon Insertion вставит semicolon после
|
Реализуйте duplicate([1, 2, 3]), чтобы получить [1, 2, 3, 1, 2, 3].
Это shallow copy: вложенные объекты не клонируются, а остаются теми же ссылками. |
Реализуйте FizzBuzz до 100.
Задача проверяет порядок условий, modulo и читаемую структуру ветвлений. |
Что вернут выражения 'hello' || 'world' и 'foo' && 'bar'?
|
|
Напишите IIFE и объясните, зачем она раньше использовалась.
IIFE выполняется сразу и создает отдельную scope для локальных переменных. До ES modules ее часто использовали, чтобы не загрязнять global scope и скрывать implementation details. |
Практика по JavaScript #
Junior #
Реализуйте chunk(array, size).
|
Что проверяет: работу с массивами, границы цикла, edge cases. Функция должна разбить массив на группы длиной
На интервью важно обсудить пустой массив, |
Middle #
Реализуйте retry для асинхронной операции.
|
Что проверяет: Promise,
В production-версии стоит добавить Follow-up вопросы:
|
Реализуйте простой EventEmitter.
|
Что проверяет: структуры данных, callbacks, cleanup подписок.
Копия |
Реализуйте безопасное чтение значения по строковому пути.
|
Что проверяет: работу с объектами, optional access, защиту от некорректного пути.
В ответе важно не использовать небезопасный |
Middle+ or Senior #
Как реализовать polyfill для Promise.all?
|
Нужно сохранить порядок результатов, принять обычные значения вместе с promises и отклонить итоговый promise при первой ошибке.
Частые ошибки: возвращать результаты в порядке завершения, забывать пустой массив, не оборачивать обычные значения через
|
