React interview Flashcards
RU
что такое Object.keys, Object.values, и Object.entries в JavaScript?
Object.keys(obj) — возвращает массив ключей объекта.
Object.values(obj) — возвращает массив значений объекта.
Object.entries(obj) — возвращает массив пар [ключ, значение] для каждого свойства объекта.
Что такое debounce и как он работает?
Когда функция обёрнута в debounce, она не выполняется сразу, а ждет некоторое время после последнего вызова. Если в течение этого времени происходит новый вызов, таймер сбрасывается, и функция снова ждет. Это особенно полезно для функций, которые могут вызываться часто, например, при вводе текста в поле или при прокрутке страницы.
function debounce(func, delay) {
let timer;
return function (…args) {
clearTimeout(timer);
timer = setTimeout(() => func.apply(this, args), delay);
};
}
// Использование
const debouncedFunc = debounce(() => console.log(‘Executed!’), 300);
debouncedFunc(); // Будет выполнено через 300 мс, если нет нового вызова
Чем отличается var от let и const в JavaScript?
var:
Действительно, var имеет функциональную область видимости, а не блочную. Это значит, что он виден в функции, но не внутри блока (if, for и т.д.).
Поддерживает всплытие (hoisting), так что переменная как бы “поднимается” к началу своей области видимости.
let и const:
Блочная область видимости: они видны только внутри блока, в котором объявлены.
const — значение переменной нельзя переназначить (но если это объект, можно изменять его свойства).
let можно переназначить, но нельзя повторно объявить в той же области.
В чем разница между function declaration и function expression в JavaScript?
Function Declaration (объявление функции):
Записывается как function name() {}.
Выполняется до начала кода благодаря всплытию (hoisting), так что функция доступна во всем блоке, даже если вызвана до её объявления.
Function Expression (функциональное выражение):
Создается как часть выражения, например, let func = function() {} или const func = () => {}.
Не всплывает, так что доступна только после строки, где объявлена.
Итак, основные отличия: всплытие и доступность до инициализации.
Что такое CORS и зачем он нужен?
CORS (Cross-Origin Resource Sharing) — это механизм, который позволяет ограничить доступ к ресурсам на одном домене с веб-страниц, загруженных с другого домена.
По умолчанию браузеры блокируют такие запросы для защиты от потенциальных угроз.
Сервер может настроить CORS, добавляя специальные заголовки, чтобы разрешить доступ с определенных доменов.
Что такое async и defer в контексте загрузки скриптов в HTML?
async:
Скрипт загружается асинхронно, то есть не блокирует загрузку HTML-документа.
Выполняется сразу после загрузки, даже если HTML еще не полностью обработан. Это может привести к выполнению скрипта до завершения разбора документа.
defer:
Скрипт загружается асинхронно, но его выполнение откладывается до тех пор, пока весь HTML-документ не будет полностью разобран.
Подходит для скриптов, которые зависят от полной загрузки DOM.
Каковы основные виды хуков в React?
useState:
Хук, который позволяет добавлять состояние в функциональные компоненты. Возвращает массив с текущим состоянием и функцией для его обновления.
useEffect:
Используется для выполнения побочных эффектов в функциональных компонентах, таких как запросы к API или подписка на события. Срабатывает после рендеринга компонента и может быть настроен на выполнение при изменении зависимостей.
useMemo:
Позволяет запоминать результат функции и пересчитывать его только тогда, когда изменяются определенные зависимости. Это полезно для оптимизации производительности, когда есть дорогие вычисления.
useReducer
Хук для управления состоянием, похожий на useState, но более подходящий для сложных состояний или состояний, зависящих от предыдущего состояния.
Обычно используется с функциональными компонентами, где состояние может изменяться в зависимости от определенных действий.
useContext
Позволяет использовать контекст API, чтобы передавать данные через дерево компонентов, не передавая их явно через props.
Упрощает работу с глобальным состоянием или данными, которые могут использоваться в разных компонентах.
useRef
Возвращает изменяемый объект, который сохраняет .current свойство. Обычно используется для доступа к DOM-элементам или хранения изменяемых значений, которые не требуют перерисовки компонента.
Полезен для работы с элементами ввода, анимациями и интеграцией с библиотеками.
Что такое мемоизация?
Мемоизация — это оптимизационная техника, которая сохраняет результаты вызовов функции и возвращает кэшированный результат, когда те же входные параметры передаются снова.
Это помогает избежать лишних вычислений и повышает производительность, особенно для дорогих по времени операций.
В React:
useMemo: Используется для мемоизации вычисленных значений.
useCallback: Мемоизирует функции, предотвращая их пересоздание при каждом рендере.
Что такое рекурсия и как она работает в JavaScript?
Рекурсия — это метод решения задач, при котором функция вызывает саму себя для выполнения подзадач. В JavaScript рекурсия может использоваться для обработки структур данных, таких как деревья или для решения задач, которые могут быть разбиты на более мелкие, схожие задачи, например, вычисление факториала. Важно помнить о базовом случае, который останавливает рекурсию, чтобы избежать бесконечного цикла.
Что такое query-селекторы и как они используются в JavaScript?
Query-селекторы — это методы, позволяющие выбирать элементы из DOM по различным критериям. В JavaScript используются методы document.querySelector и document.querySelectorAll. querySelector возвращает первый найденный элемент, соответствующий указанному селектору, тогда как querySelectorAll возвращает все подходящие элементы в виде NodeList. Эти методы поддерживают различные CSS-селекторы, что позволяет разработчикам эффективно находить и манипулировать элементами на странице.
Какие основные методы массивов доступны в JavaScript и для чего они используются?
JavaScript предоставляет множество методов для работы с массивами. К основным из них относятся map, filter, reduce, forEach, push, pop, shift и unshift. Метод map создает новый массив, применяя функцию к каждому элементу, filter возвращает новый массив с элементами, прошедшими проверку, а reduce применяет функцию к каждому элементу массива, аккумулируя результаты. Эти методы облегчают манипуляцию данными и делают код более читаемым и декларативным.
map(callback): Создает новый массив, в котором каждый элемент — это результат вызова функции callback для каждого элемента исходного массива. Например, array.map(x => x * 2) удваивает каждый элемент массива.
filter(callback): Создает новый массив с элементами, прошедшими проверку, определяемую функцией callback. Например, array.filter(x => x > 10) вернет все элементы больше 10.
reduce(callback, initialValue): Применяет функцию callback к каждому элементу массива, аккумулируя результат в одно значение. Например, array.reduce((sum, x) => sum + x, 0) суммирует все элементы массива.
forEach(callback): Выполняет указанную функцию callback для каждого элемента массива, но не возвращает новый массив. Например, array.forEach(x => console.log(x)) выводит каждый элемент в консоль.
push(element): Добавляет один или несколько элементов в конец массива и возвращает новую длину массива.
pop(): Удаляет последний элемент из массива и возвращает его.
shift(): Удаляет первый элемент из массива и возвращает его, изменяя длину массива.
unshift(element): Добавляет один или несколько элементов в начало массива и возвращает новую длину массива.
Что такое Object.keys, Object.values и Object.entries в JavaScript?
Object.keys(obj): Возвращает массив, содержащий все ключи (свойства) указанного объекта. Например, Object.keys({a: 1, b: 2}) вернет [‘a’, ‘b’].
Object.values(obj): Возвращает массив всех значений, соответствующих ключам объекта. Например, Object.values({a: 1, b: 2}) вернет [1, 2].
Object.entries(obj): Возвращает массив пар [ключ, значение] для каждого свойства объекта. Например, Object.entries({a: 1, b: 2}) вернет [[‘a’, 1], [‘b’, 2]]. Этот метод полезен для итерации по объектам с помощью методов массивов, таких как map или forEach.
Что такое деструктурирующее присваивание и как его использовать?
Деструктурирующее присваивание — это синтаксис в JavaScript, который позволяет распаковывать значения из массивов или свойства объектов в отдельные переменные.
Для массивов: можно извлечь значения из массива с помощью синтаксиса const [a, b] = array;. Например, если const arr = [1, 2, 3], то const [x, y] = arr; присвоит x = 1 и y = 2.
Для объектов: можно получить свойства объекта через const {name, age} = obj;. Если const obj = {name: ‘Alice’, age: 25}, то const {name, age} = obj; присвоит name = ‘Alice’ и age = 25.
Этот подход делает код более чистым и понятным, упрощая работу с данными и улучшая читаемость. Деструктуризация также может использоваться с параметрами функций, что позволяет более удобно передавать объект в функцию и извлекать необходимые значения.
Что такое остаточные параметры и оператор расширения в JavaScript?
Остаточные параметры (rest parameters) и оператор расширения (spread operator) — это две важные возможности в JavaScript, которые позволяют работать с массивами и функциями более гибко.
Остаточные параметры обозначаются троеточием (…) и позволяют функции принимать переменное количество аргументов. Они собирают оставшиеся аргументы в массив. Например:
function sum(…args) {
return args.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4)); // 10
Оператор расширения также используется с троеточием и позволяет развернуть массив или объект в отдельных элементах. Например:
const arr = [1, 2, 3];
const newArr = […arr, 4, 5]; // [1, 2, 3, 4, 5]
Эти возможности значительно упрощают работу с функциями и коллекциями, делая код более читаемым и кратким.
Что такое замыкание в JavaScript и как оно работает?
Замыкание — это функция, которая имеет доступ к своей собственной области видимости, области видимости внешней функции и глобальной области видимости, даже после завершения внешней функции. Замыкания позволяют создавать функции с «закрытыми» переменными, которые недоступны извне.
Пример:
function outerFunction() {
let outerVar = ‘Я внешний’;
function innerFunction() {
console.log(outerVar); // Доступ к внешней переменной
}
return innerFunction;
}
const myFunction = outerFunction();
myFunction(); // ‘Я внешний’
В этом примере innerFunction является замыканием, так как она имеет доступ к переменной outerVar, даже после завершения outerFunction. Замыкания полезны для создания приватных переменных и функций.
В чем разница между let, const и var в JavaScript?
let, const и var — это ключевые слова для объявления переменных в JavaScript, и между ними есть важные различия:
var: Используется для объявления переменных с функциональной или глобальной областью видимости. Подвержен всплытию (hoisting), что означает, что переменная доступна до ее объявления. Однако использование var не рекомендуется из-за его неожиданных особенностей.
let: Позволяет объявлять переменные с блочной областью видимости. Переменные, объявленные с помощью let, не доступны вне блока, в котором они были определены. В отличие от var, let не подвержен всплытию, если объявление находится в блоке.
const: Также имеет блочную область видимости, но используется для объявления констант, которые не могут быть переназначены. Однако это не делает сам объект неизменяемым — свойства объекта, объявленного с const, могут изменяться.
Пример:
var a = 1;
let b = 2;
const c = 3;
a = 4; // допустимо
b = 5; // допустимо
// c = 6; // ошибка: Assignment to constant variable
Рекомендуется использовать let и const для избежания проблем, связанных с областью видимости и переопределением переменных.
В чем разница между setTimeout и setInterval в JavaScript?
setTimeout и setInterval — это методы, используемые для планирования выполнения кода через заданные интервалы времени.
setTimeout(callback, delay): Выполняет функцию callback один раз после истечения указанного времени в миллисекундах (delay). Это полезно для задержки выполнения кода. Например:
setTimeout(() => {
console.log(‘Это сообщение появится через 2 секунды’);
}, 2000);
setInterval(callback, delay): Выполняет функцию callback регулярно, с заданным интервалом времени в миллисекундах. Это может быть полезно для повторяющихся задач, таких как обновление интерфейса или таймер. Например:
setInterval(() => {
console.log(‘Это сообщение будет появляться каждую секунду’);
}, 1000);
Важно помнить, что оба метода возвращают идентификатор таймера, который можно использовать для остановки выполнения с помощью clearTimeout или clearInterval.
Как работают методы call и apply в JavaScript?
call и apply — это методы функции, которые позволяют вызвать функцию с указанным значением this и передать аргументы.
call(thisArg, …args): Вызывает функцию с указанным значением this и принимает аргументы в виде отдельных значений. Например:
function greet() {
console.log(Привет, ${this.name}
);
}
const user = { name: ‘Алексей’ };
greet.call(user); // Привет, Алексей
apply(thisArg, [args]): Похож на call, но принимает аргументы в виде массива. Это удобно, когда количество аргументов заранее неизвестно. Например:
function sum(a, b) {
return a + b;
}
console.log(sum.apply(null, [1, 2])); // 3
Оба метода полезны для управления контекстом выполнения функции, особенно в ситуациях, когда необходимо использовать методы объектов или передавать контекст функции.
Что такое анонимные функции в JavaScript?
Анонимные функции — это функции, которые не имеют имени. Они могут быть определены и использованы в месте объявления, что позволяет создавать функции «на лету». Чаще всего анонимные функции используются как аргументы для других функций, таких как обработчики событий или в методах массивов. Пример:
setTimeout(function() {
console.log(‘Это анонимная функция’);
}, 1000);
Анонимные функции также могут быть стрелочными:
setTimeout(() => {
console.log(‘Это стрелочная анонимная функция’);
}, 1000);
Анонимные функции позволяют легко создавать временные функции, но могут затруднить отладку, так как они не имеют имен.
Что такое всплытие (hoisting) в JavaScript?
Всплытие — это механизм в JavaScript, при котором объявления переменных и функций перемещаются в верхнюю часть их области видимости во время компиляции. Это означает, что вы можете использовать переменные и функции до их фактического объявления в коде.
Пример с функцией:
console.log(myFunction()); // “Привет”
function myFunction() {
return “Привет”;
}
Пример с переменной:
console.log(a); // undefined
var a = 5;
console.log(a); // 5
В случае с переменной, её значение будет undefined до фактического присваивания, но объявление переменной будет «всплывать». Важно помнить, что let и const не подвержены всплытию, так как они имеют блочную область видимости и вызов до их объявления приведет к ошибке.
В чем разница между объявлением функции (function declaration) и выражением функции (function expression)?
Объявление функции и выражение функции — это два способа создания функций в JavaScript, и между ними есть ключевые различия.
Объявление функции (function declaration): Это более традиционный способ создания функций. Функции, объявленные таким образом, доступны в любом месте своей области видимости благодаря всплытию. Например:
function myFunction() {
console.log(‘Привет’);
}
Выражение функции (function expression): Функции, созданные с помощью выражений, могут быть анонимными или именованными, и они не подвержены всплытию. Такие функции доступны только после их объявления. Например:
const myFunction = function() {
console.log(‘Привет’);
};
Таким образом, при использовании выражений функции они должны быть объявлены перед использованием, в то время как объявления функций могут быть вызваны до их фактического определения.
В чем ключевые различия между старым JavaScript и новым (ES6 и выше)?
С появлением ES6 и последующих версий JavaScript, язык претерпел значительные изменения и улучшения. Вот некоторые ключевые различия:
Синтаксис: Новый синтаксис включает стрелочные функции, шаблонные литералы (template literals), деструктуризацию и короткие записи для объектов, что делает код более лаконичным и читаемым.
Объявление переменных: Появление let и const позволяет избежать проблем с областью видимости и всплытием, которые были присущи var.
Классы: ES6 ввел синтаксис классов для создания объектов, что делает OOP более интуитивно понятным.
class Animal {
constructor(name) {
this.name = name;
}
}
Модули: Новый JavaScript поддерживает модули, позволяя организовать код и импортировать/экспортировать функциональность между файлами.
Промисы: Вместо коллбеков для обработки асинхронных операций введены промисы, что улучшает управление асинхронным кодом.
Эти изменения сделали JavaScript более мощным, гибким и удобным для разработчиков.