Junior
Ключевые особенности JavaScript?
Junior
В чём разница между JavaScript и Java?
Junior
Каковы преимущества JavaScript?
Junior
Какие есть недостатки у JavaScript?
Junior
Какие типы данных существуют в JavaScript?
Junior
Что такое примитивные типы данных в JavaScript?
Junior
Что означает динамическая типизация в JavaScript?
Junior
Как объявить переменную в JavaScript?
Junior
В чём разница между var, let и const?
Junior
Что такое поднятие (hoisting) переменных и функций?
Junior
Какие значения в JavaScript являются «ложными» (falsy)?
Junior
В чём разница между операторами == и ===?
Junior
В чём разница между значениями null и undefined?
Junior
Что такое NaN и какого типа это значение?
Junior
Как проверить, что переменная имеет значение NaN?
Junior
Как определить тип переменной в JavaScript?
Junior
Как преобразовать строку в число в JavaScript?
Junior
Как преобразовать число в строку в JavaScript?
Junior
Что такое массив в JavaScript?
Junior
Как добавить элемент в конец массива?
Junior
Как удалить последний элемент из массива?
Junior
Как добавить элемент в начало массива?
Junior
Как удалить первый элемент массива?
Junior
Как вставить элемент в массив по определённому индексу?
Junior
Как удалить элемент массива по индексу?
Junior
Как создать копию массива (клонировать массив)?
Junior
Что такое объект в JavaScript и как его создать?
Junior
Как удалить свойство из объекта?
Junior
Что такое JSON и для чего он используется?
Junior
Как конвертировать объект JavaScript в JSON-строку?
Junior
Как из JSON-строки получить объект JavaScript?
Junior
Что такое DOM?
Junior
Как получить элемент на странице по его id?
Junior
Чем отличается document.querySelector от document.getElementById?
Junior
В чём разница между свойствами innerHTML и textContent?
Junior
Как добавить CSS-класс элементу?
Junior
Как удалить CSS-класс у элемента?
Junior
Как назначить обработчик события на элемент?
Junior
Что такое всплытие событий?
Junior
Что такое погружение (capture) событий?
Junior
Для чего используется метод event.preventDefault()?
Junior
Как обработать исключения (ошибки) в JavaScript?
Junior
Что такое строгий режим ("use strict") и как его включить?
Junior
Что такое функция обратного вызова (callback)?
Junior
Что такое Promise?
Junior
Что такое async/await?
Junior
В чём разница между синхронным и асинхронным кодом?
Junior
Для чего нужны функции setTimeout и setInterval?
Junior
Что такое ECMAScript?
Junior
Какие новые возможности появились в ES6?
Junior
Что такое шаблонные строки (template literals) в JavaScript?
Junior
В чём разница между Function Declaration и Function Expression?
Junior
Что такое стрелочная функция (arrow function) в JavaScript?
Junior
Что такое объект arguments?
Junior
Как передаются аргументы функций: по значению или по ссылке?
Junior
Что произойдёт, если обратиться к переменной без объявления?
Junior
Что вернёт оператор typeof для массива?
Junior
Для чего используется метод Array.map()?
Junior
Для чего используется метод Array.filter()?
Junior
Для чего используется метод Array.reduce()?
Junior
Как работает метод Array.forEach()?
Junior
Чем отличается Array.forEach() от Array.map()?
Junior
Как удалить пробелы в начале и конце строки?
Junior
Как проверить, содержит ли строка определённую подстроку?
Junior
Как разделить строку по разделителю на части?
Junior
Как соединить элементы массива в строку?
Junior
Как округлить число до ближайшего целого?
Junior
В чём разница между Math.floor() и Math.ceil()?
Junior
Как получить случайное число в JavaScript?
Junior
Как проверить, является ли значение числом (конечным)?
Junior
Что такое cookie и для чего оно используется?
Junior
Как работает метод fetch и для чего он используется?
Junior
Что такое AJAX и зачем он нужен?
Junior
Middle
Что такое замыкание и как оно работает?
Middle
Как работает прототипное наследование в JavaScript?
Middle
Что такое ключевое слово `this` и как определяется его значение?
Middle
Чем отличается `this` в стрелочной функции?
Middle
Что такое цикл событий (Event Loop) в JavaScript?
Middle
Какие состояния может принимать Promise?
Middle
Что такое цепочка промисов (promise chaining)?
Middle
Что такое "ад колбеков" (callback hell) и как его избежать?
Middle
Что такое делегирование событий?
Middle
В чём разница между методами call, apply и bind?
Middle
Все три метода позволяют вручную задать значение `this` при вызове функции. `func.call(thisArg, arg1, arg2, ...)` вызывает функцию `func` с указанным `thisArg` и переданными аргументами. `func.apply(thisArg, argsArray)` делает то же, но аргументы передаются в виде массива (или подобного ему объекта). Метод `bind` работает иначе: `func.bind(thisArg, arg1, arg2, ...)` возвращает новую функцию, у которой `this` навсегда привязан к `thisArg` (и, опционально, частично переданы аргументы по умолчанию). Эта привязанная функция может вызываться позже сколько угодно раз. В сумме: call и apply вызывают функцию сразу, а bind – привязывает контекст для последующих вызовов функции.
Что такое функция высшего порядка?
Middle
Как создать объект без прототипа?
Middle
Как проверить наличие свойства в объекте?
Middle
Почему сравнение двух объектов {} возвращает false?
Middle
Что такое модуль в JavaScript?
Middle
В чём разница между модулями CommonJS и ES6?
Middle
Как клонировать объект в JavaScript?
Middle
Что такое деструктуризация в JavaScript?
Middle
Что такое rest-параметр и для чего он используется?
Middle
Что такое spread-оператор и для чего он используется?
Middle
Что такое WeakMap и как он отличается от Map?
Middle
Чем отличается WeakSet от Set?
Middle
Как работает сборщик мусора в JavaScript?
Middle
Что такое IIFE и зачем она используется?
Middle
В чём разница между event.preventDefault() и event.stopPropagation()?
Middle
Что такое "debounce" и "throttle" и зачем они нужны?
Middle
Как можно повысить производительность JavaScript-кода?
Middle
Что такое мемоизация и когда она применяется?
Middle
Что такое полифил и зачем он нужен?
Middle
В чём разница между циклами for...in и for...of?
Middle
Можно ли использовать стрелочную функцию как конструктор?
Middle
Что такое поверхностное и глубокое копирование объектов?
Middle
Как обработать ошибки в асинхронном коде (в Promise или async/await)?
Middle
Какими способами можно выполнять асинхронные операции в JavaScript?
Middle
Что такое регулярные выражения и для чего они используются?
Middle
В чём разница между операторами typeof и instanceof?
Middle
`typeof` применяется к значению и возвращает строку с названием его типа (\"string\", \"number\", \"boolean\", \"undefined\", \"object\", \"function\" или \"symbol\", \"bigint\"). Он полезен для примитивов и функций. `instanceof` же проверяет принадлежность объекта к классу/конструктору: выражение `obj instanceof Constructor` вернёт true, если в цепочке прототипов объекта obj есть Constructor.prototype. Например, `arr instanceof Array` проверит, является ли arr массивом. `instanceof` работает только с объектами (для примитивов не имеет смысла) и учитывает наследование. Таким образом, typeof удобен для определения примитивных типов, а instanceof – для проверки типа объекта по его прототипу.
В чём разница между cookie, localStorage и sessionStorage?
Middle
Каковы преимущества использования Map по сравнению с объектом?
Middle
Объекты в JavaScript можно использовать как словари, но структура Map предоставляет для этого ряд преимуществ. Во-первых, **ключи** в Map могут быть значениями любого типа (в том числе объекты), тогда как в обычном объекте ключи – только строки или символы. Во-вторых, Map легко узнать размер с помощью свойства `size`, тогда как у объекта нужно вручную считать ключи. Также в Map перебор элементов происходит в порядке их вставки, и Map не имеет прототипа с потенциальными конфликтующими ключами (у Object есть унаследованные свойства, например toString). К тому же, методы Map (set, get, has, delete) могут быть удобнее и работать чуть быстрее для словарных операций, поскольку Map специально для этого предназначен.
Почему использование eval() считается плохой практикой?
Middle
Как выполнить несколько промисов параллельно?
Middle
В чём разница между Promise.all и Promise.race?
Middle
Для чего нужен метод Promise.finally()?
Middle
Поддерживает ли JavaScript ООП и как оно реализовано?
Middle
Чем отличаются свойства event.target и event.currentTarget?
Middle
`event.target` – это исходный элемент, на котором произошло событие (например, конкретная кнопка, по которой кликнули). `event.currentTarget` – элемент, на котором в данный момент выполняется обработчик. Если обработчик назначен непосредственно на элементе, обычно target и currentTarget совпадают. Но при всплытии, когда обработчик стоит на родителе, `event.target` будет потомок (источник события), а `event.currentTarget` – сам родитель, который сейчас обрабатывает событие. Таким образом, target полезен, чтобы узнать исходный элемент, вызвавший событие, а currentTarget – чтобы узнать, на каком элементе запущен данный обработчик.
Для чего используются операторы break и continue?
Middle
В чём разница между событиями DOMContentLoaded и load?
Middle
Событие `DOMContentLoaded` происходит на объекте `document` когда HTML-документ полностью загружен и разобран, но внешние ресурсы (картинки, стили, фреймы) ещё могут догружаться. То есть DOM готов к работе. Событие `load` происходит на объекте `window` после загрузки всех ресурсов страницы – в том числе изображений, стилей, скриптов и пр. Обычно `DOMContentLoaded` наступает раньше, и в нём удобно инициализировать скрипты, не дожидаясь тяжелых ресурсов. Событие `load` же полезно, когда нужно убедиться, что всё полностью загружено (например, для скриптов, рассчитывающих размеры изображений).
Почему не рекомендуется изменять прототипы встроенных объектов?
Middle
Изменение (монкипатчинг) прототипов встроенных объектов (таких как Array, Object, Function и т.д.) может привести к ряду проблем. Во-первых, это может вызвать конфликт: разные библиотеки или части кода могут определять одноимённые методы, что приведёт к непредвиденному поведению. Во-вторых, новые свойства в прототипах будут перечисляться циклом for...in по всем объектам данного типа, что может нарушить логику существующего кода. В-третьих, некоторые встроенные методы могут полагаться на стандартное поведение прототипов. В целом, изменение глобальных прототипов влияет на всё окружение и усложняет поддержку кода, поэтому лучше избегать этого и расширять функциональность другими способами (утилиты, наследование, композиция и т.п.).
Что такое Symbol и для чего он нужен?
Middle
Для чего используется тип BigInt?
Middle
В чём разница между функциями parseInt() и parseFloat()?
Middle
Чем отличается isNaN() от Number.isNaN()?
Middle
Чем отличается Array.forEach() от Array.map()?
Middle
Что такое геттеры и сеттеры в JavaScript?
Middle
Почему промисы (или async/await) предпочтительнее колбеков?
Middle
В чём разница между XMLHttpRequest и fetch()?
Middle
Что такое CORS?
Middle
Как преобразовать NodeList в массив?
Middle
Что возвращает typeof при применении к функции?
Middle
Senior
Что такое опциональная цепочка (`?.`) в JavaScript?
Senior
Для чего используется оператор `??` (nullish coalescing)?
Senior
В чём разница между микрозадачами и макрозадачами в Event Loop?
Senior
В JavaScript-цикле событий задачи делятся на макрозадачи (events, или «очередь сообщений») и микрозадачи (jobs). Макрозадачи – это основные события, поступающие в очередь (например, обработчики DOM-событий, таймауты, сетевые ответы). Микрозадачи – задачи более высокого приоритета, которые выполняются сразу после текущего кода и перед тем, как Event Loop возьмёт следующую макрозадачу. Примеры микрозадач: колбеки промисов (then/catch/finally) и process.nextTick в Node.js. Механизм такой: после выполнения текущего скрипта или обработчика, сначала выполняются все накопившиеся микрозадачи (и возможно добавляют новые – те тоже выполняются), и только затем Event Loop переходит к следующей макрозадаче из очереди (например, следующему событию или сообщению).
Что такое утечка памяти в JavaScript и как её избежать?
Senior
Утечка памяти – это ситуация, когда программа удерживает ссылки на объекты, которые уже не нужны, из-за чего сборщик мусора не может освободить память. В JavaScript утечки памяти могут возникать, например, при размещении объектов в глобальной области (они остаются на всё время работы приложения), при создании замыканий, удерживающих большие структуры неосвобождёнными, или при забытом очищении таймеров/обработчиков (они хранят ссылки на объекты). Чтобы избежать утечек, следует: освобождать ненужные ссылки (обнулить свойства, удалить обработчики событий, очищать массивы, если они больше не нужны), избегать создания ненужных глобальных переменных, следить за замыканиями (не хранить в замыкании избыточные данные). В современных браузерах крупные утечки – редкость, но внимательность требуется, особенно в долгоживущих одностраничных приложениях.
Что происходит при вызове функции с ключевым словом `new`?
Senior
Что такое Proxy и для чего он используется?
Senior
Proxy – это встроенный объект, введённый в ES6, позволяющий перехватывать и переопределять базовые операции над другим объектом. Прокси создаётся как `new Proxy(target, handler)`, где target – проксируемый объект, а handler – объект с «ловушками» (trap) – функциями, которые будут обрабатывать различные операции: чтение свойства (get), запись свойства (set), вызов функции, оператор in, удаление свойства и многое другое. Proxy полезен, например, для логирования и отладки доступа к объекту, для реализации наблюдения за изменениями (reactive data), для создания защитных оболочек, валидаторов и т.д. По сути, Proxy позволяет программно контролировать поведение объекта при взаимодействии с ним.
Как сделать свойство объекта неперечисляемым?
Senior
Что такое типизированный массив (TypedArray)?
Senior
Типизированные массивы – это особые объекты для работы с бинарными данными. Они включают ArrayBuffer и представители: Uint8Array, Int16Array, Float32Array и т.д. Такие массивы хранят элементы одного определённого типа (целые без знака, с определённой разрядностью, числа с плавающей точкой и т.п.) и позволяют эффективно работать с двоичными данными, например, при обработке файлов, сетевых буферов, в WebGL. По сути, ArrayBuffer – это сырой блок памяти, а типизированные представления (Uint8Array и др.) – «представления» этой памяти как массива определённых числовых значений. Они гораздо ближе к работе с памятью, как в языках C/C++, и служат для высокопроизводительных вычислений или работы с бинарными протоколами.
Что такое каррирование функций (currying)?
Senior
Как сделать объект итерируемым и для чего используется Symbol.iterator?
Senior
Объект считается итерируемым, если он имеет специальный метод с ключом `Symbol.iterator`. Этот метод должен возвращать итератор – объект с методом `next()`, который при каждом вызове возвращает объект формата { value: ..., done: ... }. Пример: `obj[Symbol.iterator] = function() { return { next() { ... } } }`. `Symbol.iterator` – это встроенный символ, используемый JavaScript для определения поведения объекта в цикле for...of и других местах, ожидающих итератор (например, Spread-оператор ...). В стандартных структурах (Array, Map и т.д.) Symbol.iterator уже реализован. Таким образом, чтобы сделать свой класс или объект итерируемым, нужно определить в нём метод Symbol.iterator, и тогда его экземпляры можно перебрать через for...of.
Почему 0.1 + 0.2 не равно 0.3?
Senior
Чем отличается значение undefined от ошибки "is not defined"?
Senior
Что такое чистая функция (pure function) в JavaScript?
Senior
Чистая функция – это функция, которая не имеет побочных эффектов и при одинаковых входных данных всегда возвращает одинаковый результат. Побочных эффектов нет – значит, она не изменяет внешние переменные, не производит ввод/вывод, не меняет состояние, видимое снаружи (как глобальные объекты или аргументы-объекты). Чистые функции облегчают тестирование и понимание, так как их влияние локально – они зависят только от аргументов. Пример чистой функции: математическая функция, например `square(x) { return x * x; }`. В отличие от нечистой, например, `random()` или функция, меняющая глобальное состояние.
Что такое лексическое окружение (lexical environment) в JavaScript?
Senior
Объясните понятия "стек вызовов" (call stack) и "куча" (heap) в JavaScript.
Senior
Стек вызовов – это структура данных (LIFO), в которой хранится последовательность вызовов функций и контекстов выполнения в процессе работы программы. Когда вызывается новая функция, запись о ней (контекст) помещается наверх стека, а когда функция завершается – запись снимается. Если стек вызовов переполняется (например, из-за бесконечной рекурсии), возникает ошибка \"stack overflow\". Куча (heap) – это большая неструктурированная область памяти, из которой выделяется память под объекты, массивы и другие динамические данные. В JS управлением памятью занимается сборщик мусора, который освобождает память в куче от объектов, на которые нет ссылок. Проще говоря, стек – для контроля порядка выполнения (функции и их локальные переменные), куча – для размещения объектов в памяти.
В чём разница между использованием const и Object.freeze() для объектов?
Senior
Что такое генераторная функция (function*) и как работает yield?
Senior
Генератор – это особый вид функции, объявляемой с помощью `function*`, которая может приостанавливать своё выполнение и возобновлять его. Внутри генератора используется ключевое слово `yield` для выдачи промежуточного значения и паузы. Вызов генератора возвращает итератор (объект с методом next). При вызове `.next()` генератор выполняется до ближайшего yield и возвращает его значение, при следующем next – продолжится с места остановки. Если генератор завершается (достиг конца или return), done: true. Например: `function* gen() { yield 1; yield 2; }` – возвращает итератор, у которого первый next() даст {value:1, done:false}, второй – {value:2, done:false}, третий – {value: undefined, done:true}. Генераторы удобны для создания итераторов или реализции \"ленивых\" вычислений, а также могут использоваться для упрощения работы с асинхронным кодом (до появления async/await).
Что возвращает функция, объявленная с async?
Senior
Что такое паттерн "Наблюдатель" (Observer) и где он используется?
Senior
Чем различаются __proto__ и свойство prototype?
Senior
Что такое XSS-атака и как от неё защититься?
Senior
Для чего нужны атрибуты async и defer в теге `<script>`?
Senior
Оба атрибута предназначены для загрузки внешних скриптов без блокировки HTML-документа. `async` означает, что скрипт загружается асинхронно и выполняется сразу после загрузки, не дожидаясь других скриптов. При этом порядок выполнения async-скриптов не гарантируется (какой загрузился первым, тот и запустился). Атрибут `defer` тоже загружает скрипт параллельно, но откладывает его выполнение до тех пор, пока весь HTML-документ не будет полностью обработан (DOMContentLoaded). Кроме того, скрипты с defer сохраняют порядок относительно друг друга. Используя async, ставят независимые скрипты (например, аналитика), а defer – скрипты, которым нужно DOM и которые могут идти в определённом порядке.
Чем отличается event.stopImmediatePropagation() от event.stopPropagation()?
Senior
Зачем вызывают setTimeout(func, 0)?
Senior
Вызов `setTimeout(func, 0)` планирует выполнение функции `func` сразу после текущего исполнения кода, поставив её в очередь сообщений. По сути, это способ отложить выполнение на минимально возможное время – когда текущий стек завершится и Event Loop возьмёт новую задачу (наш колбек). Практически это применяют, чтобы, например, отложить выполнение тяжёлой функции, позволив браузеру обновить интерфейс, или выстроить правильный порядок событий (некоторые действия выполнить асинхронно, даже если они могли бы быть синхронными). В современных браузерах аналог – `queueMicrotask` для микрозадач, но setTimeout с нулевой задержкой остаётся простым способом разместить задачу в конец очереди макрозадач.
Что такое контекст выполнения (execution context) в JavaScript?
Senior
Контекст выполнения – это абстракция, описывающая среду, в которой выполняется текущий код. Каждый раз при вызове функции создаётся новый контекст выполнения. Он включает: 1) лексическое окружение (переменные, функции, аргументы, `this` и т.д.), 2) информацию о том, как функция была вызвана (например, значение this, идентификатор функции), 3) может содержать внешние данные (ссылка на внешнее окружение). Глобальный код выполняется в глобальном контексте выполнения. Контексты образуют стек вызовов. Когда функция заканчивает выполнение, её контекст снимается со стека. Управление контекстами – важная часть работы движка, скрытая от разработчика, но понимание, что у каждой функции свой \"внутренний мир\" (локальные переменные, this и пр.), – это и есть контекст выполнения.
Поддерживает ли JavaScript оптимизацию хвостовых вызовов (tail-call optimization)?
Senior
Что такое шаблон "Модуль" (Module pattern) в JavaScript?
Senior
В чём разница между глобальным объектом в браузере и в Node.js?
Senior
Что делает метод Promise.allSettled()?
Senior
Promise.allSettled, добавленный в ES2020, ждёт завершения всех переданных промисов, но в отличие от Promise.all, он никогда не переходит в состояние rejected. Он всегда выполняется успешно, даже если некоторые промисы были отклонены. Результатом allSettled является промис, который выполняется с массивом результатов в виде объектов: {status: "fulfilled", value: ...} для успешно выполненных или {status: "rejected", reason: ...} для отклонённых промисов. Это полезно, когда нужно дождаться *всех* операций, не прерываясь из-за ошибки, и затем обработать индивидуально их результаты и ошибки.
Что произойдёт, если конструктор функции при вызове через `new` вернёт объект?
Senior
Какое значение принимает `this` при вызове функции без контекста в строгом режиме и вне строгого?
Senior
Как JavaScript выполняет нестрогое сравнение (==) разных типов?
Senior
Как объявить приватное поле класса?
Senior
В чём разница между Object.seal() и Object.freeze()?
Senior
Что такое "Temporal Dead Zone" в JavaScript?
Senior
Temporal Dead Zone (TDZ) – это период времени от начала области видимости (например, функции или блока) до момента фактического объявления переменной `let` или `const`, в течение которого переменная существует, но недоступна для использования. Если попытаться обратиться к переменной в TDZ, возникнет ReferenceError. Проще: переменные let/const поднимаются логически, но не инициализируются. Это объясняет, почему нельзя использовать переменную, объявленную через let, до её строчки объявления. TDZ заканчивается, когда исполнение кода достигает строки объявления переменной – тогда она инициализируется. Этот механизм сделан для предотвращения доступа к переменной до её явного объявления, в отличие от var, которое при hoisting инициализируется undefined.
Как JavaScript преобразует объект к примитивному значению?
Senior
Когда требуется использовать объект там, где нужен примитив (например, при сложении объекта с числом или сравнении с строкой), JavaScript пытается преобразовать объект к примитиву (строке или числу). Алгоритм таков: он вызывает у объекта метод `valueOf` (если существует) – должен вернуть примитив. Если valueOf не вернул примитив, вызывается метод `toString`. То, что вернёт toString (обычно строка), и будет примитивным представлением. Например, у массива метод toString возвращает объединённые элементы, поэтому `[1,2] + ""` -> `"1,2"`. У объекта по умолчанию valueOf возвращает сам объект, а toString – строку `"[object Object]"`. Поэтому, например, `{} + ""` -> \"[object Object]\".
Что произойдёт, если использовать объект как ключ свойства обычного объекта?
Senior
Чему равно выражение [] == ![] и почему?
Senior