- Это данные, которые не являются объектом и не имеют методов
- Примитивные: string, number, boolean, null, undefined, bigint, symbol
- Остальные типы: object, function
- Стрелочные функции
- Классы
- Шаблонные строки
- Расширенные объектные литералы
- Деструктуризация
- Промисы
- Генераторы
- Модули
- Symbol
- Прокси
- Множества
- Параметры по умолчанию
- Операторы rest и spread
- Блочная область видимости, ключевые слова «let» и «const»
Пустая строка, 0, null, undefined, NaN, false
Переменные, объявленные с помощью ключевого слова «var», являются глобальными. Это означает, что они доступны из любого места в коде. Переменные, объявленные с помощью ключевых слов «let» и «const» имеют блочную область видимости. Разница между «let» и «const» состоит в том, что в первом случае мы может менять значение переменной, а во втором — нет.
Переменная foo примет значение "1020" - В JavaScript это поведение называется приведением типов
Можно использовать унарный плюс, он преобразует строку в число, если это возможно. Унарный минус делает тоже самое
В отличии от примитивов объекты сравниваются по ссылке
Следует использовать функцию Boolean или оператор двойное отрицание
Для решения данной задачи можно использовать оператор "&" (бинарное и). Оператор "&" сравнивает операнды как бинарные значения const isEven = num & 1 ? false : true
toString() не будет работать с undefined или null, потому что класс этих объектов не реализовывает метод toString, а поскольку String является независимым объектом, а не методом, унаследованным от прототипа, то его можно использовать с объектами, у которых нет метода toString()
Шаблонные литералы — относительно новый способ создания строк в JS. Шаблонные литералы создаются с помощью двойных обратных кавычек
Это специальное значение «Not a Number», которое обычно говорит о том, что была выполнена бессмысленная операция, ошибка математической операции. Так же есть функция isNaN(), которая проверяет является ли строка не числом.
is not defined это код ошибки при обращении к не существующей переменной. undefined - это значение, присваемое объявленной, но не инициализированной переменной.
Оператор логическое и, находит и возвращает первое ложное значение либо последний операнд, когда все значения истинные
Атрибут — это начальное состояние в рендеринге DOM, а свойство — это текущее состояние.
Оператор логическое находит и возвращает первое истинное значение. Он также использует короткое замыкание.
Согласно MDN оператор "+" действительно является самым быстрым способом преобразования строки в число, поскольку он не выполняет никаких операций со значением, которое является числом.
DOM или Document Object Model (объектная модель документа) — это прикладной программный интерфейс (API) для работы с HTML и XML документами.
В JS объекты и примитивы сравниваются по-разному. Примитивы сравниваются по значению. Объекты — по ссылке или адресу в памяти, где хранится переменная.
Оператор двойное отрицание приводит значение справа от него к логическому значению.
Для этого мы можем использовать оператор запятая.
Область видимости — это место, где мы имеем доступ к переменным или функциям. JS имеем три типа областей видимости: глобальная, функциональная и блочная.
Вы можете добавить свойство к объекту используя, myObject.propName = value, и удалить свойство, используя delete myObject.propName.
Object.freeze работает со значениями объектов и делает объект неизменяемым, то есть изменить его свойства невозможно. Можно проверить заморожен ли объект с помощью Object.isFrozen().
- Оператор spread
- Object assign
- глубокое клонирование: JSON parse c JSON stringify.
- Оператор in
- Метод hasOwnProperty
- Объектный литерал
- Функция-конструктор
- Метод Object create.
Оператор «in» проверяет наличие свойства не только в самом объекте, но и в его прототипах, а метод hasOwnProperty — только в объекте.
Цикл for in или Object keys и forEach.
Деструктуризация — относительно новый способ получения (извлечения) значений объекта или массива.
Объект Set позволяет хранить уникальные значения.
Это коллекция ключ значение, как и Object. Но основное отличие в том, что Map позволяет использовать ключи любого типа и даже объекты.
- Объект, на который указывает ссылка proto, называется «прототипом»
- При чтении свойства из объекта, если его в нём нет, оно ищется в proto
- Операции присвоения или удаления свойства совершаются всегда над самим объектом obj.
Классы — это относительно новый способ написания функций-конструкторов в JS. Это синтаксический сахар для функций-конструкторов. В основе классов лежат те же прототипы и прототипное наследование.
- Объекты JS связаны цепочками прототипов с помощью proto свойства, по которым им передаются методы и свойства. При обращении к свойству или методу объекта сначала происходит поиск этого свойства у самого объекта. В случае неудачи поиск перенаправляется в его прототип.
- Например, когда мы хотим прочитать свойство из object, а оно отсутствует, JavaScript автоматически берёт его из прототипа, если оно существует.
Для этого можно использовать встроенный метод Array.isArray().
- Это данные, хранящиеся в небольших текстовых файлах на вашем компьютере
- Куки обычно устанавливаются веб-сервером при помощи заголовка Set-Cookie
- Один из наиболее частых случаев использования куки – это аутентификация
- Break и continue обеспечивают более точный контроль над выполнением кода в цикле
- Break завершает текущую итерацию и приводит к немедленному выходу из цикла
- Continue завершает текущую итерацию, но не останавливает цикл
- Return работает так же как и break и вдобавок может вернуть с функции значение остановив выполнение функции.
Команда use strict включает так называемый строгий режим. В этом режиме предупреждения становятся ошибками.
Это создание функции и вместе с ней окружения, к которому она может обращаться. Это позволяет ей работать с переменным и функциям этого окружения в дальнейшем.
- Это краткий способ записи функциональных выражений
- Стрелочные функции не являются конструкторами, то есть нельзя с помощью new создать объект-экземпляр функции
- Не поддерживает ключевые слова this, если быть точнее, то this в стрелочной функции будет ссылаться на this функции снаружи
- Отсутствие arguments, содержащий список аргументов с которым обычная функция была вызвана
- Можно вернуть значение, если стрелочная функция состоит из одной строки
- В классах не нужна привязка к this, то-есть не нужно писать дополнительную функцию bind
- Стрелочные функции не имеют атрибута прототипа.
- Аргумент — это конкретное значение, которое мы «передали» функции при её вызове в скобочках. Это значение или набор значений присваивается формальным параметрам этой функции.
- Параметр — это название переменной, указанное в объявлении функции и ожидающее присваивания конкретного значения в момент вызова функции.
- Присваиваемое параметру значение и есть аргумент.
- Каррирование – это трансформация функций таким образом, чтобы они принимали аргументы не одним списком через запятую, а по отдельности. Это продвинутая техника для работы с функциями
- Она может быть полезной, когда мы пишем для калбека функцию, в которую нужно помимо event передать еще что-то.
Это когда мы у объекта можем вызывать функции по цепочке, один за другим.
Выражения можно записывать в одну строку через запятую.
- Это механизм в JavaScript, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен
- Стоит отметить то, что механизм «поднятия» передвигает только объявления функции или переменной. Назначения переменным остаются на своих местах.
Данный метод возвращает функцию, по отношению к которой он вызывается, но с подмененным контекстом.
Arguments — это коллекция аргументов, передаваемых функции. Это объект, подобный массиву, у него есть свойство length, мы можем получить доступ к определенному значению с помощью arguments[i], но у него отсутствуют методы forEach, reduce, filter и map. Он позволяет узнать количество параметров функции.
IIFE или Immediately Invoked Function Expression — это функция, которая вызывается или выполняется сразу же после создания или объявления.
- Потому что они обрабатываются также, как и любое другое значение в JS
- Важным отличием функции является то, что функция может быть выполнена или вызвана.
- Их определение выглядит по разному
- Механизм поднятия в JS не срабатывает для Function Expression.
Это когда алгоритм или функция вызывает сама себя.
Это самая обычная функция, которая на вход принимает другую функцию.
- Функции обратного вызова
- Промисы
- Async await
Промисы — это один из приемов работы с асинхронным кодом в JS. Они возвращают результат асинхронной операции. Промисы были придуманы для решения проблемы так называемого «ада функций обратного вызова».
- PromiseAll возвращает массив значений от всех промисов
- PromiseAllSettled возвращает массив с объектами, в которых находятся status, а так же value при разрешении промиса или reason при ошибке.
Async await — относительно новый способ написания асинхронного (неблокирующего) кода в JS. Им оборачивают промис. Он делает код более читаемым и чистым, чем промисы и функции обратного вызова.
Операторы spread и rest имеют одинаковый синтаксис. Разница состоит в том, что с помощью spread мы передаем или распространяем данные массива на другие данные, а с помощью rest — получаем все параметры функции и помещаем их в массив или извлекаем часть параметров.
Функция обратного вызова — это функция, вызов которой отложен на будущее (происходит при некоторых условиях, например, при наступлении события).
Это относительно новый способ определения значений переменных по умолчанию.
- Иммутабельность предполагает, что после создания данные или структура, которая их содержит, не могут быть изменены
- Мутабельность означает что данные могут меняться.
Модули позволяют объединять, использовать, код из разных файлов и избавляют нас от необходимости держать весь код в одном большом файле.
Пирамида тестирования — один из способов обеспечения качества ПО, визуализация, которая помогает группировать тесты по типу их назначения.
Так как javascript идет сверху вниз, то переменные, которые должны быть определены ниже, попадают в мертвую зону, до того момента пока они не определятся.
Методы – это свойства объектов, в которые записаны функции. Если это так, тогда почему работает такой код? hello.toUpperCase Строка (примитивный тип), у которого нет свойств и методов, но когда мы вызываем метод toUpperCase, это не приводит к ошибке. Временный объект отбрасывается по завершении работы со свойством или методом. Причина такого поведения заключается в том, что hello временно преобразуется в объект. У каждого примитива, кроме null и undefined, есть объект-обертка. Такими объектами являются String, Number, Boolean, Symbol и BigInt.
- Управление памятью в JavaScript выполняется автоматически и незаметно для нас. - Основной концепцией управления памятью в JavaScript является принцип достижимости. Достижими считаются те, которые доступны или используются. Они гарантированно находятся в памяти.
- Чтобы объект стал не достижимым нужно удалить на него все ссылки, после того как он станет не достижимым он удалиться из памяти.
- Помимо значения value, свойства объекта имеют три специальных атрибута дескрипторов:
- writable – если true, свойство можно изменить, иначе оно только для чтения.
- enumerable – если true, свойство перечисляется в циклах, в противном случае циклы его игнорируют.
- configurable – если true, свойство можно удалить, а эти атрибуты можно изменять, иначе этого делать нельзя.
- Есть методы, которые ограничивают доступ ко всему объекту, например Object freeze.
Новый вид функций в современном JavaScript. Они отличаются от обычных тем, что могут приостанавливать своё выполнение, возвращать промежуточный результат и далее возобновлять его позже, в произвольный момент времени.
- «Символ» представляет собой уникальный идентификатор. Он не являются строкой и по спецификации должен использоваться в объектах как ключ
- При создании, символу можно дать описание, в основном использующееся для отладки кода: let id = Symbol("id")
- Свойства, чьи ключи – символы, не перебираются циклом for..in. Object.keys(user) также игнорирует символы.
- Символы позволяют создавать «скрытые» свойства объектов, к которым нельзя нечаянно обратиться и перезаписать их из других частей программы
- Для чтения или при отсутствии создания символа из реестра, используется вызов Symbol for key.
- Это высокопроизводительный движок JavaScript и WebAssembly от Google с открытым исходным кодом, написанный на C++
- Кроме того, что отличает V8 от других движков, он применяется в популярной серверной среде Node.js
- Для того, чтобы добиться высокой скорости выполнения программ, V8 транслирует JS-код в более эффективный машинный код, не используя интерпретатор.
- Идея событийного цикла очень проста. Есть бесконечный цикл, в котором движок JavaScript ожидает задачи, исполняет их и снова ожидает появления новых. Задачи из очереди исполняются по правилу «первым пришёл – первым ушёл»
- Кроме главного списка задач существуют микрозадачи и макрозадачи
- В микрозадачи попадают калбеки завершенных промисов, функции внутри queueMicrotask()
- В макрозадачи попадают колбеки планирования и обработчики событий
- Сначала выполняется основной код, затем микрозадачи и за ними макрозадачи.
Cross-Origin Resource Sharing — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность пользователю получать разрешения на доступ к выбранным ресурсам с сервера на источнике, отличном от того, что сайт использует в данный момент.
XSS (Cross-Site Scripting — «межсайтовый скриптинг») — довольно распространенная уязвимость, которую можно обнаружить на множестве веб-приложений. Ее суть довольно проста, злоумышленнику удается внедрить на страницу JavaScript-код, который не был предусмотрен разработчиками.
Императивное программирование — это описание того, как ты делаешь что-то, а декларативное — того, что ты делаешь.
Single Page Application - это реализация веб-приложения таким образом, чтобы при первой загрузке пользователь получал все ресурсы, необходимые для того, чтобы избавиться от загрузки страницы с нуля, при совершении интерактивных действий с интерфейсом.
- Объектно-ориентированное программирование основано на концепции объектов. Это структуры данных, которые содержат поля данных, известные в JavaScript как свойства, и процедуры, известные как методы (Например: Math с его методами random, max, sin и свойствами такими как PI)
- Функциональное программирование основан на концепции чистых функций, которые избегают общего состояния, изменяемых данных и побочных эффектов