JavaScript заметки
8.67K subscribers
2.69K photos
4 videos
1.24K links
Регулярные заметки по практическому JavaScript. Обучащию посты позволят прокачать навыки во Frontend-разработке.

Можно почитать пока компилируется проект :)

Сотрудничество: @noname_media

Канал на бирже: telega.in/channels/notesjs/card?r=Wj7h1mbl
Download Telegram
innerHTML: содержимое элемента

Свойство innerHTML позволяет получить HTML-содержимое элемента в виде строки.

Мы также можем изменять его. Это один из самых мощных способов менять содержимое на странице.

На картинке выше содержимое document.body, скрипт полностью заменяет его.

#dom #браузер
👍2
Кавычки

В JavaScript есть разные типы кавычек.
Строку можно создать с помощью одинарных, двойных либо обратных кавычек.

Одинарные и двойные кавычки работают, по сути, одинаково, а если использовать обратные кавычки, то в такую строку мы сможем вставлять произвольные выражения, обернув их в ${…}.

Ещё одно преимущество обратных кавычек — они могут занимать более одной строки, как на картинке выше.

Одинарные и двойные кавычки в языке с незапамятных времён: тогда потребность в многострочных строках не учитывалась. Что касается обратных кавычек, они появились существенно позже, и поэтому они гибче.

#кавычки #строки
👍2
Function Expression

Функция в JavaScript – это не магическая языковая структура, а особого типа значение.
Синтаксис, который часто используется называется Function Declaration (Объявление Функции).

Существует ещё один синтаксис создания функций, который называется Function Expression (Функциональное Выражение).

На картинке выше функция создаётся и явно присваивается переменной, как любое другое значение. По сути без разницы, как мы определили функцию, это просто значение, хранимое в переменной sayHi.

Смысл обоих примеров кода одинаков: "создать функцию и поместить её значение в переменную sayHi"

#функции #function_expression
👍2
Браузерные события

Событие – это сигнал от браузера о том, что что-то произошло. 
Все DOM-узлы подают такие сигналы (хотя события бывают и не только в DOM).

Вот список самых часто используемых DOM-событий:

События мыши:
 - click – происходит, когда кликнули на элемент левой кнопкой мыши (на устройствах с сенсорными экранами оно происходит при касании).
 - contextmenu – происходит, когда кликнули на элемент правой кнопкой мыши.
 - mouseover / mouseout – когда мышь наводится на / покидает элемент.
 - mousedown / mouseup – когда нажали / отжали кнопку мыши на элементе.
 - mousemove – при движении мыши.

События на элементах управления:
 - submit – пользователь отправил форму <form>.
 - focus – пользователь фокусируется на элементе, например нажимает на <input>.

Клавиатурные события:
 - keydown и keyup – когда пользователь нажимает / отпускает клавишу.

#браузерные_события #DOM
👍21
Глобальный объект

Глобальный объект предоставляет переменные и функции, доступные в любом месте программы. 
По умолчанию это те, что встроены в язык или среду исполнения.

В браузере он называется window, в Node.js — global, в другой среде исполнения может называться иначе.
Недавно globalThis был добавлен в язык как стандартизированное имя для глобального объекта, которое должно поддерживаться в любом окружении. 

Ко всем свойствам глобального объекта можно обращаться напрямую.
В браузере глобальные функции и переменные, объявленные с помощью var (не let/const!), становятся свойствами глобального объекта.

#глобальный_объект #window
👍5
Имена переменных

В JavaScript есть два ограничения, касающиеся имён переменных:

 - Имя переменной должно содержать только буквы, цифры или символы $ и _.
 - Первый символ не должен быть цифрой.

Если имя содержит несколько слов, обычно используется верблюжья нотация, то есть, слова следуют одно за другим, где каждое следующее слово начинается с заглавной буквы: myVeryLongName.

Самое интересное – знак доллара '$' и подчёркивание '_' также можно использовать в названиях.
Это обычные символы, как и буквы, без какого-либо особого значения.

Важно помнить!!! Регистр имеет значение. Переменные с именами apple и AppLE – это две разные переменные.

#имена_переменных #основы
👍2
new.target

Используя специальное свойство new.target внутри функции, мы можем проверить, вызвана ли функция при помощи оператора new или без него.

В случае, если функция вызвана при помощи new, то в new.target будет сама функция, в противном случае undefined.

Это можно использовать, чтобы отличить обычный вызов от вызова «в режиме конструктора».

Такой подход иногда используется в библиотеках для создания более гибкого синтаксиса, который позволяет разработчикам вызывать функции при помощи оператора new или без него.

#new_target #объекты
👍2
DOM-дерево

Основой HTML-документа являются теги.

В соответствии с объектной моделью документа («Document Object Model», коротко DOM), каждый HTML-тег является объектом. Вложенные теги являются «детьми» родительского элемента. Текст, который находится внутри тега, также является объектом.

Все эти объекты доступны при помощи JavaScript, мы можем использовать их для изменения страницы.

Например, document.body – объект для тега <body>.

Если запустить код на картинке выше, то <body> станет красным на 3 секунды:

#DOM #документ
👍41🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Прокачивай свой технический английский без больших усилий, уделяя 5 минут в день!

На этом канале регулярно публикуют самые популярные слова и выражения из мира IT.

Подойдет всем IT-специалистам, которые хотят без труда читать документацию на английском и свободно общаться с иностранными заказчиками.

Подписывайся на @enforit и качай свой инглиш, пока компилируется проект👌
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Прокачивай навыки JavaScript решая практические тесты!

На нашем втором канале JavaScript тесты каждый день выходят викторины на знание особенностей языка.

Подпишись, чтобы не потерять 👇

#javascript #тесты
👍2
У стрелочных функций нет «this»

Стрелочные функции особенные: у них нет своего «собственного» this
Если мы используем this внутри стрелочной функции, то его значение берётся из внешней «нормальной» функции.

Например, на картинке выше arrow() использует значение this из внешнего метода user.sayHi().

Это является особенностью стрелочных функций. Они полезны, когда мы на самом деле не хотим иметь отдельное значение this, а хотим брать его из внешнего контекста.

#this #стрелочные_функции
👍4
Set

Объект 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 – возвращает количество элементов в множестве.

Основная «изюминка» – это то, что при повторных вызовах set.add() с одним и тем же значением ничего не происходит, за счёт этого как раз и получается, что каждое значение появляется один раз.

#set #словари
👍6
Symbol.iterator

Symbol.iterator - специальный встроенный Symbol , который позволяет сделать объект итерируемым.

Например, у нас есть объект range, который представляет собой диапазон чисел. Чтобы сделать range итерируемым (и позволить for..of работать с ним), нам нужно добавить в объект метод с именем Symbol.iterator.

- Когда цикл for..of запускается, он вызывает этот метод один раз (или выдаёт ошибку, если метод не найден). Этот метод должен вернуть итератор – объект с методом next.
- Дальше for..of работает только с этим возвращённым объектом.
- Когда for..of хочет получить следующее значение, он вызывает метод next() этого объекта.
- Результат вызова next() должен иметь вид {done: Boolean, value: any}, где done=true означает, что итерация закончена, в противном случае value содержит очередное значение.

#перебираемые_объекты #symbol_iterator
👍5
Fetch

JavaScript может отправлять сетевые запросы на сервер и подгружать новую информацию по мере необходимости.

Например, мы можем использовать сетевой запрос, чтобы:

 - Отправить заказ
 - Загрузить информацию о пользователе
 - Запросить последние обновления с сервера
 - …и т.п.

Метод fetch() — современный и очень мощный, поэтому начнём с него. Он не поддерживается старыми (можно использовать полифил), но поддерживается всеми современными браузерами.

Базовый синтаксис:

 - url – URL для отправки запроса.
 - options – дополнительные параметры: метод, заголовки и так далее.

Без options это простой GET-запрос, скачивающий содержимое по адресу url.

#fetch #сетевые_запросы
👍3
Прокрутка

Встроенное свойство «length» содержит количество параметров функции в её объявлении.

Событие прокрутки scroll позволяет реагировать на прокрутку страницы или элемента. 
Есть много хороших вещей, которые при этом можно сделать.

Например:

 - Показать/скрыть дополнительные элементы управления или информацию, основываясь на том, в какой части документа находится пользователь.
 - Подгрузить данные, когда пользователь прокручивает страницу вниз до конца.

Вот картинке выше функция для отображения текущей прокрутки.

#прокрутка #интерфейсные_события
👍6
Глобальный catch

Давайте представим, что произошла фатальная ошибка (программная или что-то ещё ужасное) снаружи try..catch, и скрипт упал.

Существует ли способ отреагировать на такие ситуации? 
Можно залогировать ошибку, показать что-то пользователю (обычно они не видят сообщение об ошибке) и т.д.

В браузере мы можем присвоить функцию специальному свойству window.onerror, которая будет вызвана в случае необработанной ошибки.

Синтаксис на картинке выше.

 - message
Сообщение об ошибке.
 - url
URL скрипта, в котором произошла ошибка.
 - line, col
Номера строки и столбца, в которых произошла ошибка.
 - error
Объект ошибки.

Роль глобального обработчика window.onerror обычно заключается не в восстановлении выполнения скрипта – это скорее всего невозможно в случае программной ошибки, а в отправке сообщения об ошибке разработчикам.

#глобальный_catch #обработка_ошибок
👍6
Что будет выведено в консоль?
#middle #arrays
👍1
FormData

FormData - это объект, представляющий данные HTML формы.

Если передать в конструктор элемент HTML-формы form, то создаваемый объект автоматически прочитает из неё поля.

Его особенность заключается в том, что методы для работы с сетью, например fetch, позволяют указать объект FormData в свойстве тела запроса body.

Он будет соответствующим образом закодирован и отправлен с заголовком Content-Type: form/multipart.

То есть, для сервера это выглядит как обычная отправка формы.

P.S. на картинке выше пример отправки данных простой HTML формы с помощью fetch.

#formData #сетевые_запросы
👍3
WebSocket

Протокол WebSocket, описанный в спецификации RFC 6455, обеспечивает возможность обмена данными между браузером и сервером через постоянное соединение. Данные передаются по нему в обоих направлениях в виде «пакетов», без разрыва соединения и дополнительных HTTP-запросов.

WebSocket особенно хорош для сервисов, которые нуждаются в постоянном обмене данными, например онлайн игры, торговые площадки, работающие в реальном времени, и т.д.

В JavaScript WebSocket генерирует 4 события, с помощью которых и строится всё взаимодействие:
- open – соединение установлено;
- message – получены данные;
- error – ошибка;
- close – соединение закрыто.

#WebSocket #сетевые_запросы
👍3
Server Sent Events

Спецификация Server-Sent Events описывает встроенный класс EventSource, который позволяет поддерживать соединение с сервером и получать от него события.
Как и в случае с WebSocket, соединение постоянно.

Работа с потоком данных:
- Текст сообщения указывается после data:, пробел после двоеточия необязателен;
- Сообщения разделяются двойным переносом строки \n\n;
- Чтобы разделить сообщение на несколько строк, мы можем отправить несколько data: подряд (третье сообщение).

Про сравнение SSE с WS.
Протокол SSE одновременно похож на WebSocket, но также сильно отличается. Например, данные отправляются лишь с сервера на клиент и могут иметь только текстовой формат. Однако это не делает SSE ненужным, напротив, у него своя ниша.
Основное преимущество в простоте использования, что делает SSE более привлекательным для проектов, где вся мощь WS абсолютно не требуется.

#sse #сетевые_запросы
👍2🔥1