Современный JavaScript для нетерпеливых.
Данная книга – полное, но при этом лаконичное руководство по версии JavaScript E6 и выше. Вам не потребуется знаний старых версий языка, а сразу предлагается начать с более мощных современных.
Автор бестселлеров Кэй С. Хорстман рассказывает обо всем, что вам необходимо знать, излагая материал небольшими порциями, рассчитанными на легкое усвоение. Практические советы и примеры кода помогут эффективно воспользоваться всеми новшествами, избежать подводных камней и устаревших средств и извлечь максимум пользы из надежных инструментов и фреймворков для разработки ПО на современном JavaScript.
Данная книга – полное, но при этом лаконичное руководство по версии JavaScript E6 и выше. Вам не потребуется знаний старых версий языка, а сразу предлагается начать с более мощных современных.
Автор бестселлеров Кэй С. Хорстман рассказывает обо всем, что вам необходимо знать, излагая материал небольшими порциями, рассчитанными на легкое усвоение. Практические советы и примеры кода помогут эффективно воспользоваться всеми новшествами, избежать подводных камней и устаревших средств и извлечь максимум пользы из надежных инструментов и фреймворков для разработки ПО на современном JavaScript.
Почему виртуальный DOM является более эффективным, чем "грязная" проверка (dirty check)?
Виртуальный DOM
В React при каждом обновлении DOM или изменении данных, используемых страницей, создается новое объектное представление пользовательского интерфейса. Это всего лишь легковесная копия DOM.
Виртуальный DOM имеет почти такие же свойства, что и настоящий DOM, но он не может напрямую модифицировать содержимое (контент) страницы. Манипуляции с виртуальным DOM быстрее, поскольку он ничего не обновляет на экране. Простыми словами, работа с виртуальным DOM - это работа с копией реального DOM, не более того.
Обновление виртуального DOM быстрее благодаря следующему:
1. Использованию эффективного алгоритма определения различий
2. Совмещению (группировке, объединению) операций по обновлению
3. Оптимизированному обновлению поддеревьев
4. Использованию наблюдаемых объектов для определения изменений вместо "грязной" проверки
5. Как работает виртуальный DOM
При рендеринге JSX-элемента обновляется виртуальный DOM. Это происходит очень быстро. После обновления новая версия виртуального DOM сравнивается со старой (снимком, выполненным перед обновлением). После этого, React определяет отличия между двумя объектами. Данный процесс называется diffing.
Затем React обновляет только те части браузерного DOM, которые подверглись изменениям. За счет этого React очень сильно выигрывает в производительности.
Если кратко, то вот что происходит при обновлении DOM в React:
1. Обновляется виртуальный DOM
2. Обновленный виртуальный DOM сравнивается с предыдущим
3. Определяются различия между версиями виртуального DOM
4. Обновляются только изменившиеся элементы браузерного DOM
5. Изменения отображаются на экране
Виртуальный DOM
В React при каждом обновлении DOM или изменении данных, используемых страницей, создается новое объектное представление пользовательского интерфейса. Это всего лишь легковесная копия DOM.
Виртуальный DOM имеет почти такие же свойства, что и настоящий DOM, но он не может напрямую модифицировать содержимое (контент) страницы. Манипуляции с виртуальным DOM быстрее, поскольку он ничего не обновляет на экране. Простыми словами, работа с виртуальным DOM - это работа с копией реального DOM, не более того.
Обновление виртуального DOM быстрее благодаря следующему:
1. Использованию эффективного алгоритма определения различий
2. Совмещению (группировке, объединению) операций по обновлению
3. Оптимизированному обновлению поддеревьев
4. Использованию наблюдаемых объектов для определения изменений вместо "грязной" проверки
5. Как работает виртуальный DOM
При рендеринге JSX-элемента обновляется виртуальный DOM. Это происходит очень быстро. После обновления новая версия виртуального DOM сравнивается со старой (снимком, выполненным перед обновлением). После этого, React определяет отличия между двумя объектами. Данный процесс называется diffing.
Затем React обновляет только те части браузерного DOM, которые подверглись изменениям. За счет этого React очень сильно выигрывает в производительности.
Если кратко, то вот что происходит при обновлении DOM в React:
1. Обновляется виртуальный DOM
2. Обновленный виртуальный DOM сравнивается с предыдущим
3. Определяются различия между версиями виртуального DOM
4. Обновляются только изменившиеся элементы браузерного DOM
5. Изменения отображаются на экране
Почему функция setState() в React является асинхронной, а не синхронной?
Даже если состояние обновляется синхронно, пропы - всегда асинхронно. Это означает, что значение пропов является неопределенным до повторного рендеринга родительского компонента. Объекты, предоставляемые React (state, props, refs), согласованы между собой. Если вы реализуете синхронный setState(), то могут возникнуть проблемы.
setState() не изменяет state сразу, но создает запрос на изменение состояния (планирует обновление). Поэтому после обновления state теоретически может иметь старое значение. Несколько операций обновления могут объединяться в одну в целях повышения производительности.
Это связано с тем, что setState() изменяет состояние и приводит к повторному рендерингу. Если операция обновления состояние будет синхронной и при этом дорогой с точки зрения производительности, то браузер пользователя лишится интерактивности (перестанет отвечать на действия пользователя до завершения операции). Поэтому такие операции являются асинхронными и группируются для обеспечения лучшего пользовательского опыта и повышения производительности.
Даже если состояние обновляется синхронно, пропы - всегда асинхронно. Это означает, что значение пропов является неопределенным до повторного рендеринга родительского компонента. Объекты, предоставляемые React (state, props, refs), согласованы между собой. Если вы реализуете синхронный setState(), то могут возникнуть проблемы.
setState() не изменяет state сразу, но создает запрос на изменение состояния (планирует обновление). Поэтому после обновления state теоретически может иметь старое значение. Несколько операций обновления могут объединяться в одну в целях повышения производительности.
Это связано с тем, что setState() изменяет состояние и приводит к повторному рендерингу. Если операция обновления состояние будет синхронной и при этом дорогой с точки зрения производительности, то браузер пользователя лишится интерактивности (перестанет отвечать на действия пользователя до завершения операции). Поэтому такие операции являются асинхронными и группируются для обеспечения лучшего пользовательского опыта и повышения производительности.
Разделяй и Властвуй
Вам дан массив, состоящий из цифр и строковых представлений цифр.
Вам нужно вычесть сумму строковых представлений из цифр и вернуть этот результат.
Примеры:
Вам дан массив, состоящий из цифр и строковых представлений цифр.
Вам нужно вычесть сумму строковых представлений из цифр и вернуть этот результат.
Примеры:
divCon([9, 3, '7', '3']) => 2
divCon(['5', '0', 9, 3, 2, 1, '9', 6, 7]) => 14
divCon(['3', 6, 6, 0, '5', 8, 5, '6', 2,'0']) => 13Какой псевдокласс нужно применить к input, чтобы стилизовать необязательный input?
Anonymous Quiz
29%
unrequired
54%
optional
9%
unimportant
4%
dispensable
4%
permissive
Что такое управляемые и неуправляемые компоненты?
В управляемых компонентах данные формы обрабатываются React-компонентом. Альтернативой являются неуправляемые компоненты, где данные формы обрабатываются DOM.
Управляемые компоненты
В управляемых компонентах данные формы обрабатываются с помощью состояния компонента. Состояние компонента выступает в роли "единственного источника истины" (single source of truth) для "инпутов" компонента.
Неуправляемые компоненты
Неуправляемые компоненты похожи на обычные HTML-элементы. Данные каждого "инпута" сохраняются в DOM, а не в компоненте. Вместо обработчиков событий для обновления состояния, в таких компонента используются refs (ссылки, references) для извлечения значений из DOM. Ссылки позволяют получать доступ к узлам DOM или элементам React, создаваемым в методе render():
В управляемых компонентах данные формы обрабатываются React-компонентом. Альтернативой являются неуправляемые компоненты, где данные формы обрабатываются DOM.
Управляемые компоненты
В управляемых компонентах данные формы обрабатываются с помощью состояния компонента. Состояние компонента выступает в роли "единственного источника истины" (single source of truth) для "инпутов" компонента.
Неуправляемые компоненты
Неуправляемые компоненты похожи на обычные HTML-элементы. Данные каждого "инпута" сохраняются в DOM, а не в компоненте. Вместо обработчиков событий для обновления состояния, в таких компонента используются refs (ссылки, references) для извлечения значений из DOM. Ссылки позволяют получать доступ к узлам DOM или элементам React, создаваемым в методе render():
Что выведется в консоль при клике на кнопку?
Anonymous Quiz
22%
button
49%
window
20%
HTMLDocument
8%
function
Что такое React.cloneElement()?
Функция React.cloneElement() возвращает копию переданного ей элемента. В функцию могут передаваться дополнительные пропы и потомки. Она используется, когда родительский компонент хочет добавить или модифицировать пропы потомков.
1. element: элемент, подлежащий клонированию
2. props: пропы, передаваемые клонированному элементу
3. children: мы также можем передавать потомков в клонированный элемент (новые потомки заменяют старых)
Функция React.cloneElement() возвращает копию переданного ей элемента. В функцию могут передаваться дополнительные пропы и потомки. Она используется, когда родительский компонент хочет добавить или модифицировать пропы потомков.
React.cloneElement(element, [props], [...children])cloneElement() принимает три аргумента:
1. element: элемент, подлежащий клонированию
2. props: пропы, передаваемые клонированному элементу
3. children: мы также можем передавать потомков в клонированный элемент (новые потомки заменяют старых)
Какой второй опциональный аргумент может быть передан setState() и в чем его назначение?
Таким аргументом является коллбек, вызываемый после обновления состояния и повторного рендеринга компонента.
Функция setState() является асинхронной, поэтому она принимает коллбек в качестве второго параметра. Как правило, лучше использовать другой метод жизненного цикла, чем полагаться на этот коллбек, но не лишним будет знать о такой возможности.
Таким аргументом является коллбек, вызываемый после обновления состояния и повторного рендеринга компонента.
Функция setState() является асинхронной, поэтому она принимает коллбек в качестве второго параметра. Как правило, лучше использовать другой метод жизненного цикла, чем полагаться на этот коллбек, но не лишним будет знать о такой возможности.
this.setState(setState() всегда влечет за собой повторный рендеринг, пока shouldComponentUpdate() не вернет false. Во избежание лишних рендерингов, вызывайте setState() только когда новое состояние отличается от предыдущего. Также избегайте вызова setState() в таких методах жизненного цикла, как componentDidUpdate(), поскольку это может привести к бесконечному циклу.
{ username: 'Alex' },
() => console.log('Обновление состояние завершено и компонент повторно отрисован.')
)
ECMAScript 6 для разработчиков Николас Закас
Прочитав эту книгу вы узнаете о том чем полезны итераторы и генераторы, чем ссылочные функции отличаются от обычных, какие дополнительные опции позволяют работать с данными, о наследовании типов, об асинхронном программировании, о том как модули меняют способ организации кода и многое другое.
Прочитав эту книгу вы узнаете о том чем полезны итераторы и генераторы, чем ссылочные функции отличаются от обычных, какие дополнительные опции позволяют работать с данными, о наследовании типов, об асинхронном программировании, о том как модули меняют способ организации кода и многое другое.
Старый switcheroo
Напишите функцию vowel2index(str), которая принимает строку и заменяет все гласные на их номера в строке.
Примеры:
Напишите функцию vowel2index(str), которая принимает строку и заменяет все гласные на их номера в строке.
Примеры:
vowel2index('this is my string')
// 'th3s 6s my str15ng'
vowel2index('Codewars is the best site in the world')
// 'C2d4w6rs 10s th15 b18st s23t25 27n th32 w35rld'
vowel2index('')
//''