JS-core-2 Flashcards
Purpose and concept of a module/module pattern.
Идея и польза модулей в первую очередь в том, что они помогают справляться со сложностью программы. Если мы работаем с проектом на 20 тысяч строк, будет совершенно неудобно хранить весь код в одном файле.
- Инкапусляция: Модули позволяют обьединять свазанный код вместе, скрывая детали реалзиации и открывая только то, что необходимо. Это предотвращает загрязнение глобальной области видимости и уменьшает риск конфликтов имен переменных.
- Повторное использование: Разделяя код на отдельные модули, мы можем использовать эти модули повторно в разных частях приложения или даже проектах
- Поддерживаемость
- Управление зависимостями: модули могут явно указывать свои зависимсоти гарантируя, что они загружаются и инициализируются в правильном порядке.
Концепция модуля:
Модуль состоит из
- Приватные данные: переменные и функции, которые доступны извне
- Публичный API: набор функций и переменных, которые доступны для использования другими модулми или частями приложения.
Особенности:
- Всегда «use strict»
- Своя область видимости переменных
- Код в модуле выполняется только один раз при импорте
- Объект import.meta содержит информацию о текущем модуле.
- В модуле «this» не определён
- Модули являются отложенными (deferred)
- Для не-модульных скриптов атрибут async работает только на внешних скриптах. Скрипты с ним запускаются сразу по готовности, они не ждут другие скрипты или HTML-документ.
Types of modules (AMD, ES6, CommonJS, UMD).
CommonJS - Для подключения зависимостей используется глобальная функция require(), которая принимает первым параметром строку с путем к модулю. Для экспортирования интерфейса модуля мы используем свойство exports объекта module.
AMD (Asynchronous module definition ) — что дословно переводится как «Асинхронное определение модуля», используется с RequireJS. Функция define фактически занимается публикацией модуля. В основном используется в браузерской среде, позволяет загружать модули асинхронно
UMD — Определение универсального модуля, он же гибридный, позволяет поддерживать как и AMD, так и CommonJS, а также глобальные переменные, если другие форматы не поддерживаются.
ES6 модули обеспечивают современный стандарт модулей с поддеркой в большенстве современных браузеров и нода
Syntax and common features (export default, named exports, exports as).
- export default используется для экспорта одного значения или сущности из модуля. Это может быть класс, функция, обьект или примитивное значение.
- Именованные экспорты «включают в себя» своё имя. Эта информация является частью модуля, говорит нам, что именно экспортируется. Именованные экспорты вынуждают нас использовать правильное имя при импорте
Dynamic imports.
Динамические импроты позволяют загружать модули асинхронно во время выполнения программы. Это полезно для улучшения производительности приложений, особенно при работе с большими проектами, где нет необходимости загружать все модил сразу. Динамическим импорты реализованы с помощью функции import(), которая возвраащет Promise
Динамический импорт работает в обычных скриптах, он не требует указания script type=”module”.
new keyword functionality.
Ключевое слово new в JavaScript используется для создания нового экземпляра объекта. Оно привязывает this к новому обьекту, что позволяет в конструкторе устанавливать свойства и методы для этого обьекта
Constructor functions and their properties.
Функции-конструкторы технически являются обычными функциями. Но есть два соглашения:
-Имя функции-конструктора должно начинаться с большой буквы.
-Функция-конструктор должна выполняться только с помощью оператора “new”.
Обычно конструкторы не имеют оператора return. Их задача – записать все необходимое в this, и это автоматически становится результатом.
Но если return всё же есть, то применяется простое правило:
При вызове return с объектом, вместо this вернётся объект.
При вызове return с примитивным значением, оно проигнорируется.
Другими словами, return с объектом возвращает этот объект, во всех остальных случаях возвращается this.
У конструкторных функций также есть свойство “prototype”, методы и свойства долбавленные в прототайп являеются общими для всех экземпляров, созданных с использованием консруктртора
Public, private, and static members in OOP.
публичные могут быть обращены непосредственно через экземпляр класса или его прототип
Статичные принадлежнат самому классу, а не его экземплярам. Они доступны нам через сам класс и используются для общих данных или методов.
Class declaration and syntax.
Используется ключевое слово class, за которым следует имя классе. В теле класса могут определяться конструкторы, методы и статические свойства и методы.
Каждый метод, обьявленный в теле классе, автоматически добавляется в протип класса. Это позволяет всем экземплярам класса использовать один и тот же метод, что делает код более эффективным. Также поддерживается наследоование.
Differences between class declarations and constructor functions.
- Разные синтексикс.
- Методы внутри класса авоматические добавляются в прототив, что обеспечивает эффективное использование памями и общие методы для всех экземпляров. А конструктраая фукция каждый раз при создании экземпляра создает новую функцию.
- Наследование ручками нужно.
- Статические методы могут быть добавлены к функции конструктору, но они не могут быть наследовананы или доступны через экземпляр обьектов
Usage of super().
Чтобы унаследовать от класса: class Child extends Parent:
При этом Child.prototype.__proto__ будет равен Parent.prototype, так что методы будут унаследованы.
При переопределении конструктора:
Обязателен вызов конструктора родителя super() в конструкторе Child до обращения к this.
При переопределении другого метода:
Мы можем вызвать super.method() в методе Child для обращения к методу родителя Parent.
Внутренние детали:
Методы запоминают свой объект во внутреннем свойстве [[HomeObject]]. Благодаря этому работает super, он в его прототипе ищет родительские методы.
Поэтому копировать метод, использующий super, между разными объектами небезопасно.
Callbacks and IIFE.
Колбэк - это функция, которая передается в другую функцию в качестве аргемента и вызывается после завершения операции. Этот паттерн часто используется для ассинхронных операций , например для запросов к серверу или таймеры.
IIFE immediately invoked Function expression - это функция, которая определяется и сразу вызывается. Этот паттерн испольузется для создания локальной области видимости и предотвращения загрязнения глобального пространства имен.
IIFE часто использоватлись для создания модулей до появляется стандарта. Это позволяет инкапсулировать переменные и фунеции избегая их утечек в глобальное пространство имен.
Limitations of callbacks (e.g., callback hell).
Чем больше вложенных вызовов, тем наш код будет иметь всё большую вложенность, которую сложно поддерживать, особенно если вместо … у нас код, содержащий другие цепочки вызовов, условия и т.д.
Иногда это называют «адом колбэков» или «адской пирамидой колбэков».
Function currying and partial functions.
Функциональное каррирование: процесс преобразования функции с множеством аргементов в последовательность функций с одним аргументом. В результате каждый раз вызываемся функция с одним аргументом, возвращабщая новую функцию, которая ожидает следующий аргумент
//general
function add(a,b) {
return a+b;
}
///urrying
function curriedAdd(a){
return function(b){
return a+b;
};
}
const add5 = curriedAdd(5);
console.log(add5(3));
console.log(add5(7));
Частичное применений функций - процесс создания новой функции путем фиксии некоторых параметров из оргинальной функции, что позволяет уменьшить колчество аргументов в новой функции
function power(base, exponent){
return Math.pow(base, exponent);
}
const square = power.bind(null, 2);
console.log(square(3));
console.log(square(5));
Set/Map and WeakSet/WeakMap.
Map – это коллекция, структура данных, работающая по принципу
ключ/значение, как и Object. Но основное отличие от объекта в том, что Map
позволяет использовать ключи любого типа.
Объект Set – это особый вид коллекции: «множество» значений (без ключей),
своего рода массив, где каждое значение может появляться только один раз.
Методы и свойства:
new Map() – создаёт коллекцию.
map.set(key, value) – записывает по ключу key значение value.
map.get(key) – возвращает значение по ключу или undefined, если ключ key отсутствует.
map.has(key) – возвращает true, если ключ key присутствует в коллекции, иначе false.
map.delete(key) – удаляет элемент (пару «ключ/значение») по ключу key.
map.clear() – очищает коллекцию от всех элементов.
map.size – возвращает текущее количество элементов.
map.keys() – возвращает итерируемый объект по ключам,
map.values() – возвращает итерируемый объект по значениям,
map.entries() – возвращает итерируемый объект по парам вида [ключ, значение], этот вариант используется по умолчанию в for..of.
Объект Set – это особый вид коллекции: «множество» значений (без ключей), где каждое значение может появляться только один раз.
Его основные методы это:
new Set(iterable) – создаёт Set, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новый Set.
set.add(value) – добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект set.
set.delete(value) – удаляет значение, возвращает true, если value было в множестве на момент вызова, иначе false.
set.has(value) – возвращает true, если значение присутствует в множестве, иначе false.
set.clear() – удаляет все имеющиеся значения.
set.size – возвращает количество элементов в множестве.
Первое его отличие от Map в том, что ключи в WeakMap должны быть объектами, а не примитивными значениями:Теперь, если мы используем объект в качестве ключа и если больше нет ссылок на этот объект, то он будет удалён из памяти (и из объекта WeakMap) автоматически.
В WeakMap присутствуют только следующие методы:
weakMap.get(key)
weakMap.set(key, value)
weakMap.delete(key)
weakMap.has(key)
WeakMap и WeakSet используются как вспомогательные структуры данных в дополнение к «основному» месту хранения объекта. Если объект удаляется из основного хранилища и нигде не используется, кроме как в качестве ключа в WeakMap или в WeakSet, то он будет удалён автоматически.
Error handling techniques including try..catch.
Синтаксис «try…catch» работает только для ошибок возникающих во время выполнения кода
В js есть синтаксическая конструкция try..catch, которая позволяет «ловить»
ошибки и вместо падения делать что-то более осмысленное. Сначала выполняется код
внутри блока try {…}. Если в нём нет ошибок, то блок catch(err) игнорируется:
выполнение доходит до конца try и потом далее, полностью пропуская catch.
Если же в нём возникает ошибка, то выполнение try прерывается, и поток
управления переходит в начало catch(err). Переменная err (можно использовать любое
имя) содержит объект ошибки с подробной информацией о произошедшем.
Блок finaly вызовется независимо от того произошла ошибка или нет.
Когда возникает ошибка, JavaScript генерирует объект, содержащий её детали. Затем этот объект передаётся как аргумент в блок catch:
Для всех встроенных ошибок этот объект имеет два основных свойства:
name
Имя ошибки. Например, для неопределённой переменной это “ReferenceError”.
message
Текстовое сообщение о деталях ошибки.