JavaScript: middle
Promise в JavaScript – это мощный инструмент для работы с асинхронным кодом, который позволяет эффективно обрабатывать операции, требующие времени, такие как запросы к серверу, чтение файлов или таймеры. В отличие от устаревших колбэков, Promise улучшает читаемость кода и упрощает управление последовательными и параллельными асинхронными действиями. В данной статье мы рассмотрим, в каких ситуациях следует использовать Promise, как он работает, и приведем практические примеры для более глубокого понимания.
👉🏻Навигация по всем материалам в Telegram
Вопрос 1
Какой будет результат выполнения следующего кода?
- Анализ выражения:
x.concat(y)создает новый массив, объединяя массивыxиy. Результат:[1, 2, 3, 4, 5, 6].- Доступ к элементу
[1]массива[1, 2, 3, 4, 5, 6]возвращает значение2. 2 * 2вычисляется как4.y.lengthвозвращает длину массиваy, которая равна3.4 + 3вычисляется как7.- Ошибок в коде нет: Все операции корректны, и код выполняется без проблем.
Вопрос 2
Какое из следующих утверждений НЕВЕРНО относительно типов данных и хранения данных в JavaScript?
- Куки (cookies) могут быть только на клиентской стороне и используются для хранения информации о состоянии пользователя. Они имеют ограничение по размеру в несколько мегабайтов и могут быть подписаны для обеспечения целостности данных.
sessionStorageсохраняет данные только в рамках текущего сеанса работы браузера и удаляет их после закрытия вкладки или окна.- В JavaScript есть специальные типы данных для работы с датами и временем, такие как
Date,TimeиDateTime. - Переменная в JavaScript может быть объявлена с использованием одного из трех ключевых слов:
let,constилиvar. localStorageиспользуется для хранения данных на клиентской стороне браузера без ограничений по сроку хранения.
- Первое утверждение:
- Частично корректное. Куки действительно используются на клиентской стороне для хранения состояния пользователя, но максимальный размер куки обычно составляет 4 КБ, а не несколько мегабайтов.
- Второе утверждение:
- Корректное.
sessionStorageограничен текущим сеансом браузера и удаляет данные после закрытия вкладки или окна. - Третье утверждение:
- Неверное. В JavaScript есть только один специальный тип данных для работы с датами —
Date. ТипыTimeиDateTimeне существуют. - Четвертое утверждение:
- Корректное. Переменные в JavaScript действительно можно объявить с помощью ключевых слов
let,constилиvar. - Пятое утверждение:
📌Правильный ответ:
3. В JavaScript есть специальные типы данных для работы с датами и временем, такие как Date, Time и DateTime.
Вопрос 3
Какое из следующих утверждений логически НЕВЕРНО?
typeof null ! = = 'object':- Неверное утверждение.
typeof nullвсегда возвращает'object', поэтому правильное выражение:typeof null === 'object'. - Это утверждение логически неверно.
'apple' ! = = 'string1':5 >= '3':- Корректное. В JavaScript при сравнении число
'3'(строка) автоматически приводится к числу. Таким образом,5 >= 3возвращаетtrue. 7 < 11:'cat' ! = = "dog":
📌Правильный ответ:
1. typeof null ! = = 'object'
Вопрос 4
Каким будет результат выполнения данного кода?
- Сравнение массивов в JavaScript:
- В JavaScript массивы являются ссылочными типами данных.
- Операция строгого равенства (
===) для ссылочных типов сравнивает ссылки, а не значения внутри массива. - В данном коде
array1иarray2указывают на разные объекты в памяти, несмотря на одинаковое содержимое массивов. - Результат:
- Ошибок в коде нет: Оба массива определены корректно, поэтому исключений не возникает.
Вопрос 5
Вам нужен оператор, который подойдет для целей:
- Выполнения различных действий в зависимости от условия
- Быстрого переключения между условиями нескольких возможных значений
- Сравнения строго по значению и типу данных
Какой оператор лучше использовать?
switch-case:- Этот оператор идеально подходит для выполнения действий в зависимости от значений.
- Он позволяет быстро переключаться между различными условиями.
- В выражениях
caseвыполняется строгое сравнение (===), что соответствует требованию строго по значению и типу данных. for:- Этот оператор используется для циклического выполнения кода и не предназначен для выбора действий на основе условий.
if-else:- Также может использоваться для выполнения условий, но менее удобен, когда требуется переключение между множеством значений, поскольку приводит к длинным вложенным конструкциям.
do-whileиwhile:
📌Правильный ответ: 1. switch-case
Вопрос 6
Какую область видимости имеет функция, объявленная с использованием ключевого слова const в JavaScript?
- Область видимости блока
- Область видимости функции
- Глобальная область видимости
- Область видимости модуля
- Область видимости объекта
1. Область видимости переменных, объявленных через const:
- Ключевое слово
constв JavaScript задает переменные с областью видимости блока. Это означает, что переменная доступна только внутри того блока кода, где она была объявлена (например, внутри{}).
2. Функция, объявленная через const:
- Если функцию объявить через
const, она становится доступной только внутри блока, в котором была определена. Например:
- Переменные и функции, объявленные с
constвнутри модуля, имеют модульную область видимости. Но в данном случае вопрос касается общего использования.
📌Правильный ответ: 1. Область видимости блока
Вопрос 7
Какой код необходимо подставить на место пропуска, чтобы в результате получился ответ [20, 40, 60, 80, 100]?
for (let i = 1; i > array.length; i++)for (let i = 0; i < array.length; i++)for (var i = 0; i > array.length; i = i + 1)for (const i = 0; i < array.length; i++)for (const i = 0; i < array.length; i++)
- Мы хотим пройтись по массиву
myArray, умножить каждый элемент массива на2, чтобы получить результат[20, 40, 60, 80, 100].
- Начинаться с
i = 0, так как индексация массива начинается с нуля. - Условие должно быть
i < array.length, чтобы пройти по всем элементам массива. - Инкрементировать
iпосле каждой итерации, используяi++.
- Вариант 1:
for (let i = 1; i > array.length; i++)— Неверно. Индекс начинается с1, а условиеi > array.lengthсразу делает цикл неработоспособным. - Вариант 2:
for (let i = 0; i < array.length; i++)— Верно. Этот цикл корректно проходит по массиву от начала до конца. - Вариант 3:
for (var i = 0; i > array.length; i = i + 1)— Неверно. Условиеi > array.lengthделает цикл неработоспособным. - Вариант 4:
for (const i = 0; i < array.length; i++)— Неверно. Использованиеconstнедопустимо для изменяемой переменной цикла. - Вариант 5: Дублирует ошибку варианта 4.
📌Правильный ответ: 2. for (let i = 0; i < array.length; i++)
Вопрос 8
Как вы организуете структуру данных для хранения информации о товарах?
- Создать место для хранения обобщенной информации о проданных товарах.
- Добавлять новые записи о продажах в раздельные списки данных (сумма продажи, количество проданных единиц).
- Рассчитывать общую прибыль и выводить два списка: все проданные товары и общая прибыль.
- Использую глобальные переменные
- Использую только объекты
- Буду хранить данные в виде строк
- Использую вложенные массивы
- Использую массив объектов
- Хранение данных о товарах требует структурированного подхода для доступа к полям (например, названию товара, количеству, цене).
- Необходимо обеспечить возможность добавления новых записей и расчета прибыли.
- Глобальные переменные: Использование глобальных переменных нежелательно из-за сложности масштабируемости и возможных ошибок. Это плохой выбор.
- Только объекты: Подход возможен, но затруднительно обрабатывать списки записей и добавлять новые товары.
- Хранение данных в строках: Неверно. Строки не подходят для хранения структурированной информации, так как их сложно анализировать и изменять.
- Вложенные массивы: Можно использовать, но затруднительно связывать данные (например, название товара с его количеством и ценой).
- Массив объектов: Это наиболее подходящий способ. Каждый объект может представлять товар с ключами: название, количество, цена. Пример:
Дополнительные возможности: Легко рассчитать общую прибыль
const totalProfit = sales.reduce((acc, item) => acc + item.quantity * item.price, 0);
📌Правильный ответ: 5. Использую массив объектов
Вопрос 9
Какую концепцию наследования в JavaScript демонстрирует код ниже?
- Прототипное наследование
- Иерархическое наследование
- Классическое наследование
- Функциональное наследование
- Множественное наследование
- Анализ кода:
- Объект
vehicleсодержит методgetInfo. - Новый объект
myCarсоздается с помощью функцииObject.create(vehicle), что устанавливаетvehicleкак прототип дляmyCar. - Свойства
modelиyearдобавляются непосредственно вmyCar, но методgetInfoвызывается из прототипа. - Концепция наследования:
- JavaScript использует прототипное наследование, где объекты наследуют свойства и методы от других объектов (их прототипов).
- В данном случае объект
vehicleявляется прототипом дляmyCar. - Исключения:
- Иерархическое наследование: Эта концепция относится к деревьям наследования, что не явно видно в данном коде.
- Классическое наследование: Используется в языках, таких как Java, но в данном коде явно задействовано прототипное наследование.
- Функциональное наследование: Связано с использованием фабричных функций, что здесь не применяется.
- Множественное наследование: JavaScript не поддерживает прямое множественное наследование.
📌Правильный ответ: 1. Прототипное наследование
Вопрос 10
Какой из вариантов ответа точно описывает особенности прототипного наследования в JavaScript?
- Прототипное наследование в JavaScript использует классы для определения наследования и передачи свойств и методов.
- Прототипное наследование позволяет объекту наследовать свойства и методы другого объекта через прототипное ссылочное соответствие.
- Прототипное наследование позволяет создавать копии объекта при помощи конструктора.
- Прототипное наследование в JavaScript позволяет объекту наследовать свойства и методы другого объекта через функциональное ссылочное соответствие.
- Прототипное наследование обеспечивает наследование только унаследованных свойств и методов прототипа объекта.
- Анализ концепции прототипного наследования:
- Прототипное наследование в JavaScript позволяет объектам наследовать свойства и методы от другого объекта, который является их прототипом. Это достигается через ссылку на прототип.
- Механизм реализуется с помощью свойства
[[Prototype]], а для работы с ним используются методы, такие какObject.createилиObject.setPrototypeOf. - Анализ вариантов:
- Вариант 1: Неверно. Хотя JavaScript поддерживает классы (начиная с ES6), они являются синтаксическим сахаром для прототипного наследования. Само прототипное наследование не зависит от классов.
- Вариант 2: Верно. Этот вариант точно описывает суть прототипного наследования, где объект наследует свойства и методы через ссылку на прототип.
- Вариант 3: Неверно. Создание копий объекта не связано с прототипным наследованием.
- Вариант 4: Неверно. Наследование в JavaScript не является функциональным, оно основано на прототипах.
- Вариант 5: Неверно. Прототипное наследование обеспечивает доступ ко всем свойствам и методам объекта-прототипа.
📌Правильный ответ: 2. Прототипное наследование позволяет объекту наследовать свойства и методы другого объекта через прототипное ссылочное соответствие.
Вопрос 11
Какое утверждение об этом коде верно?
- Функция
greetingсохраняет значение переменнойnameтолько внутри самой функции. - Функция
sayHelloпринимает аргумент и возвращает строку. - Переменная
messageбудет доступна за пределами функцииgreeting. - Функция
sayHelloвыводит на экран строку, содержащую сообщение приветствия и имя. - Функция
greetingсоздает новый объект, содержащий методsayHello.
- Замыкания:
- В данном коде функция
greetingвозвращает вложенную функциюsayHello, которая сохраняет доступ к переменным из области видимости функцииgreeting(замыкание). - Переменные
messageиnameостаются доступными внутриsayHello, даже после завершения выполнения функцииgreeting. - Анализ утверждений:
- 1: Неверно. Замыкание позволяет
nameбыть доступным внутриsayHello, даже после завершения функцииgreeting. - 2: Неверно. Функция
sayHelloне принимает аргументов и ничего не возвращает — она вызываетconsole.log. - 3: Неверно. Переменная
messageявляется локальной для функцииgreetingи недоступна за её пределами. - 4: Верно. Функция
sayHelloвыводит строкуHello, Johnв консоль, используя значенияmessageиname. - 5: Неверно. Функция
greetingвозвращает функцию, а не объект.
📌Правильный ответ: 4. Функция sayHello выводит на экран строку, содержащую сообщение приветствия и имя.
Вопрос 12
В каком из перечисленных случаев стоит использовать Promise?
- При создании условия ветвления (
if-else) - При определении функции
- При исполнении цикла
- При использовании запросов к серверу
- При объявлении переменных
Promiseв JavaScript используется для работы с асинхронными операциями, такими как запросы к серверу, таймеры или чтение файлов.- Он представляет объект, который может находиться в одном из трёх состояний:
1: Условие if-else работает синхронно и не требует использования Promise.
2: Определение функции — это синхронная операция. Promise может быть частью функции, но не требуется для её определения.
3: Циклы выполняются синхронно. Для асинхронных операций внутри цикла можно использовать Promise, но сам цикл не требует их.
4: Верно. Запросы к серверу — асинхронная операция, и Promise подходит для её обработки.
5: Объявление переменных выполняется синхронно, поэтому Promise не нужен.
📌Правильный ответ: 4. При использовании запросов к серверу
Заключение
Использование Promise в JavaScript значительно упрощает разработку асинхронных операций, делая код более читаемым и поддерживаемым. В случаях, когда требуется выполнение запросов к серверу, обработка задержек или выполнение сложных цепочек асинхронных действий, Promise становится оптимальным решением. Понимание принципов работы Promise позволяет избежать проблем с вложенными колбэками и сделать ваш код современным и эффективным.