Всего за 1600 руб. Купить полную версию
function divide(a, b) {
try {
if (b === 0) {
throw new Error('Division by zero');
}
return a / b;
} catch (error) {
console.error('Error:', error.message);
}
}
console.log(divide(10, 2)); // Выведет: 5
console.log(divide(10, 0)); // Выведет: "Error: Division by zero"
11. Что такое hoisting в JavaScript? Как это работает с переменными и функциями?
Hoisting в JavaScript это механизм, при котором переменные и функции "поднимаются" вверх своей области видимости перед тем, как код начнет выполняться. Это означает, что переменные могут быть объявлены после их использования, а функции могут быть вызваны до их объявления. Однако только объявления переменных и функций поднимаются, а присвоения значений остаются на своих местах.
console.log(myVar); // Выведет: undefined
let myVar = 10;
12. Чем отличается синхронный код от асинхронного? Какие могут быть преимущества использования асинхронного кода?
Синхронный код выполняется последовательно, один шаг за другим, в то время как асинхронный код позволяет выполнить некоторые операции параллельно или отложить их выполнение, продолжая выполнение кода. Преимущества асинхронного кода включают повышение производительности за счет параллельного выполнения операций и предотвращение блокировки потока выполнения, что позволяет приложению быть более отзывчивым.
13. Что такое Event Loop в JavaScript? Как он влияет на выполнение асинхронного кода?
Event Loop (Цикл событий) это механизм в JavaScript, который контролирует порядок выполнения кода. Он следит за стеком вызовов и очередью колбэков, перемещая колбэки из очереди в стек при завершении синхронного кода. Это позволяет асинхронному коду выполняться после завершения синхронных операций, не блокируя основной поток выполнения.
14. Какие основные принципы функционального программирования можно использовать в JavaScript?
Принципы функционального программирования в JavaScript включают использование функций высшего порядка, чистых функций, неизменяемости данных и функций map, filter и reduce для обработки данных. Эти концепции помогают создавать более чистый, модульный и легко поддерживаемый код.
Рассмотрим каждый из этих принципов более детально:
1) Функции первого класса (First-Class Functions). В JavaScript функции являются объектами первого класса, что означает, что их можно присваивать переменным, передавать как аргументы, возвращать из других функций.
const greet = function (name) {
return `Hello, ${name}!`;
};
const sayHello = greet;
console.log(sayHello("John")); // Output: Hello, John!
2) Чистые функции (Pure Functions). Чистая функция возвращает результат, основываясь только на своих аргументах, не имеет побочных эффектов и не зависит от глобального состояния.
function add(a, b) {
return a + b;
}
console.log(add(2, 3)); // Output: 5
3) Неизменяемость (Immutability). Изменение состояния может привести к ошибкам и сложностям в отладке. В функциональном программировании ценится неизменяемость данных, и вместо изменения существующих данных создаются новые.
const numbers = [1, 2, 3];
const newNumbers = [numbers, 4]; // создание нового массива с добавлением элемента
console.log(newNumbers); // Output: [1, 2, 3, 4]
4) Функции высшего порядка (Higher-Order Functions). Это функции, которые принимают другие функции в качестве аргументов или возвращают их. Они позволяют абстрагировать операции и создавать более гибкий и читаемый код.
const multiplyBy = function (factor) {
return function (number) {
return number * factor;
};
};
const double = multiplyBy(2);
console.log(double(5)); // Output: 10
5) Рекурсия. Вместо циклов используется рекурсия для выполнения повторяющихся задач. Рекурсивные функции вызывают сами себя с изменяющимися аргументами.
function factorial(n) {
return n === 0 ? 1 : n * factorial(n 1);
}
console.log(factorial(5)); // Output: 120
6) Функциональные комбинаторы. Это функции, которые комбинируют другие функции, чтобы создавать новые. Примеры включают map, filter, и reduce.
const square = x => x * x;
const increment = x => x + 1;
const squareAndIncrement = compose(increment, square);
console.log(squareAndIncrement(3)); // Output: 10
7) Каррирование (Currying). Процесс преобразования функции с множеством аргументов в цепочку функций, каждая из которых принимает только один аргумент.
const square = x => x * x;
const increment = x => x + 1;
const squareAndIncrement = compose(increment, square);
console.log(squareAndIncrement(3)); // Output: 10
15. Что такое RESTful API? Какие HTTP методы обычно используются для взаимодействия с RESTful API?
RESTful API (Representational State Transfer API) представляет собой стандарт архитектуры веб-сервисов, основанный на принципах REST. Он использует стандартные протоколы и методы HTTP для обмена данными между клиентом и сервером. Основные принципы REST включают отсутствие состояния (stateless), клиент-серверную архитектуру и использование унифицированных интерфейсов.
HTTP методы (или HTTP глаголы) обеспечивают различные операции в RESTful API:
1) GET. Используется для запроса данных или информации от сервера. Не должен изменять состояние сервера.
2) POST. Используется для создания новых ресурсов на сервере. Часто используется при отправке данных формы.
3) PUT. Используется для обновления существующего ресурса на сервере. Полностью заменяет текущее состояние ресурса.
4) PATCH. Аналогичен PUT, но применяется для частичного обновления ресурса, а не его полной замены.
5) DELETE. Используется для удаления ресурса на сервере.
6) OPTIONS. Используется для запроса информации о возможных методах HTTP, поддерживаемых сервером для указанного ресурса.
7) HEAD. Аналогичен GET, но возвращает только заголовки без тела ответа. Часто используется для проверки доступности ресурса или получения метаданных.
8) TRACE. Этот метод запрашивает сервер отправить обратно полученный запрос, что позволяет клиенту видеть, как запрос прошел через промежуточные серверы.
9) CONNECT. Используется для установки туннеля к серверу, идентифицированному по ресурсу.
Эти методы предоставляют различные способы взаимодействия с ресурсами на сервере в рамках RESTful API.
16. Что такое Callback функции в JavaScript? Как они используются при работе с асинхронным кодом?
Callback функции это ключевой механизм в асинхронном JavaScript, который позволяет управлять асинхронными операциями и выполнением кода после завершения этих операций.
Когда мы работаем с асинхронным кодом, например, при загрузке данных с сервера или выполнении запросов, мы не можем ожидать завершения этих операций, так как это может занять время. Вместо этого, мы используем callback функции, чтобы указать, что нужно сделать после завершения определенной асинхронной операции.
Пример использования callback функции при выполнении асинхронной операции, например, загрузке данных с сервера:
function fetchData(callback) {
// Процесс загрузки данных с сервера
setTimeout(function() {
const data = 'Данные с сервера';
callback(data); // Вызываем callback функцию и передаем ей полученные данные
}, 2000); // Например, имитация задержки загрузки данных на 2 секунды
}
function displayData(data) {
console.log('Получены данные:', data);
}
fetchData(displayData); // Вызываем функцию fetchData и передаем ей displayData в качестве callback функции
В этом примере fetchData это функция, которая имитирует загрузку данных с сервера. Она принимает callback функцию в качестве аргумента и вызывает ее, когда данные будут доступны. displayData это callback функция, которая принимает данные и выводит их в консоль после их получения.