Расскажите о паттерне Observer. Приведите примеры реализации этих паттернов в известных фреймворках (библиотеках, браузерных API).
Паттерн Observer представляет собой модель, в которой объекты наблюдатели (observers) зависят от состояния и изменений, происходящих в объекте-субъекте (subject) и автоматически получают уведомления об этих изменениях. Наблюдатели подписываются на события или изменения в объекте-субъекте и реагируют на них. Паттерн Observer является промежуточной компоновкой между отправителем (subject) и получателем (observer). Когда состояние отправителя изменяется, это приводит к автоматическому уведомлению о состоянии всем подписчикам (наблюдателям).
В Vue.js можно использовать функцию
👉 @frontendInterview
Паттерн Observer представляет собой модель, в которой объекты наблюдатели (observers) зависят от состояния и изменений, происходящих в объекте-субъекте (subject) и автоматически получают уведомления об этих изменениях. Наблюдатели подписываются на события или изменения в объекте-субъекте и реагируют на них. Паттерн Observer является промежуточной компоновкой между отправителем (subject) и получателем (observer). Когда состояние отправителя изменяется, это приводит к автоматическому уведомлению о состоянии всем подписчикам (наблюдателям).
В Vue.js можно использовать функцию
watch или опцию computed, чтобы наблюдать за изменением определенных данных. Вот пример: const app = new Vue({
data() {
return {
message: 'Hello, World!',
};
},
watch: {
message(newMessage) {
console.log('Новое сообщение:', newMessage);
},
},
});
Здесь мы создали новый экземпляр Vue и объявили свойство message. Затем мы использовали опцию watch для создания наблюдателя, который реагирует на изменение свойства message.👉 @frontendInterview
👍3❤1
Ultimate Typenoscript Handbook: Build, scale and maintain Modern Web Applications with Typenoscript (2023)
Эта книга представляет собой исчерпывающее руководство по TypeScript, языку программирования, расширяющему JavaScript такими мощными возможностями, как статическая типизация, классы и интерфейсы. Книга состоит из тринадцати глав, в которых рассматривается все, начиная с настройки среды разработки и заканчивая созданием приложения на языке Angular с использованием TypeScript.
👉 @frontendInterview
Эта книга представляет собой исчерпывающее руководство по TypeScript, языку программирования, расширяющему JavaScript такими мощными возможностями, как статическая типизация, классы и интерфейсы. Книга состоит из тринадцати глав, в которых рассматривается все, начиная с настройки среды разработки и заканчивая созданием приложения на языке Angular с использованием TypeScript.
👉 @frontendInterview
Two Sum
Создайте функцию, которая принимает массив чисел и целевое число. Найдите в массиве два числа, которые в сумме дадут целевое число.
Пример:
👉 @frontendInterview
Создайте функцию, которая принимает массив чисел и целевое число. Найдите в массиве два числа, которые в сумме дадут целевое число.
Пример:
twoSum([1, 2, 3], 4) // returns [0, 2] or [2, 0]👉 @frontendInterview
🤔6👎4
Почему не стоит использовать краткую запись свойств CSS?
Существует небольшая, но на удивление важная проблема, которую я часто замечал в коде других людей — это использование краткой записи свойств CSS.
Когда мы пишем что-то вроде этого:
Почти все проблемы, баги и регрессии в CSS происходят из-за того, что мы делаем слишком многое слишком рано, а через некоторое время сталкиваемся с последствиями этого. Из этого факта следует один простой вывод: в CSS вам нужно делать лишь то, что нужно и ничего более.
👉 @frontendInterview
Существует небольшая, но на удивление важная проблема, которую я часто замечал в коде других людей — это использование краткой записи свойств CSS.
Когда мы пишем что-то вроде этого:
.btn {
background: red;
}
Мы всего лишь хотим, чтобы у нашей кнопки был красный фоновый цвет. Но на самом деле мы задаем целый набор правил: .btn {
background-image: initial;
background-position-x: initial;
background-position-y: initial;
background-size: initial;
background-repeat-x: initial;
background-repeat-y: initial;
background-attachment: initial;
background-origin: initial;
background-clip: initial;
background-color: red;
}
За счет простого использования краткой записи, мы безоговорочно решили, что не хотим использовать фоновое изображение, заодно указав для него стартовую позицию с левого верхнего края, повторение по осям x и y и прокрутку вместе с элементом и т.д.Почти все проблемы, баги и регрессии в CSS происходят из-за того, что мы делаем слишком многое слишком рано, а через некоторое время сталкиваемся с последствиями этого. Из этого факта следует один простой вывод: в CSS вам нужно делать лишь то, что нужно и ничего более.
👉 @frontendInterview
🔥18👍9👏2👎1
👍5
Расскажите про паттерн "адаптер".
Это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Проблема
Представьте, что вы делаете приложение для торговли на бирже. Ваше приложение скачивает биржевые котировки из нескольких источников в XML, а затем рисует красивые графики.
В какой-то момент вы решаете улучшить приложение, применив стороннюю библиотеку аналитики. Но вот беда — библиотека поддерживает только формат данных JSON, несовместимый с вашим приложением.
Решение
Вы можете создать адаптер. Это объект-переводчик, который трансформирует интерфейс или данные одного объекта в такой вид, чтобы он стал понятен другому объекту.
При этом адаптер оборачивает один из объектов, так что другой объект даже не знает о наличии первого. Например, вы можете обернуть объект, работающий в метрах, адаптером, который бы конвертировал данные в футы.
Адаптеры могут не только переводить данные из одного формата в другой, но и помогать объектам с разными интерфейсами работать сообща. Это работает так:
1. Адаптер имеет интерфейс, который совместим с одним из объектов.
2. Поэтому этот объект может свободно вызывать методы адаптера.
3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.
👉 @frontendInterview
Это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Проблема
Представьте, что вы делаете приложение для торговли на бирже. Ваше приложение скачивает биржевые котировки из нескольких источников в XML, а затем рисует красивые графики.
В какой-то момент вы решаете улучшить приложение, применив стороннюю библиотеку аналитики. Но вот беда — библиотека поддерживает только формат данных JSON, несовместимый с вашим приложением.
Решение
Вы можете создать адаптер. Это объект-переводчик, который трансформирует интерфейс или данные одного объекта в такой вид, чтобы он стал понятен другому объекту.
При этом адаптер оборачивает один из объектов, так что другой объект даже не знает о наличии первого. Например, вы можете обернуть объект, работающий в метрах, адаптером, который бы конвертировал данные в футы.
Адаптеры могут не только переводить данные из одного формата в другой, но и помогать объектам с разными интерфейсами работать сообща. Это работает так:
1. Адаптер имеет интерфейс, который совместим с одним из объектов.
2. Поэтому этот объект может свободно вызывать методы адаптера.
3. Адаптер получает эти вызовы и перенаправляет их второму объекту, но уже в том формате и последовательности, которые понятны второму объекту.
👉 @frontendInterview
👍16🔥1
🔥12👍7👎3
Можно ли расставить автоматическую нумерацию элементов, не относящихся к спискам при помощи только CSS?
Anonymous Quiz
85%
Да
15%
Нет
❤5👍1
Почему стоит изучать ФП на JavaScript?
Если вы опытный разработчик, уже знакомый с JavaScript или с каким-то чисто функциональным языком, то вы можете подумать, что JavaScript это весьма забавный способ открыть для себя мир ФП. В оригинальной статье, автор показывает, почему JS подходит для изучения ФП.
JavaScript имеет в своем составе важные особенности, необходимые для ФП:
1. Функции первого класса. Это возможность использовать функции как данные, т.е. передавать функции в качестве входных параметров, возвращать функции и присваивать функции переменным и свойствам объектов.
2. Анонимные функции и лямбда-синтаксис. Например, запись вида x => x * 2 является валидным выражением в JavaScript. Такой синтаксис значительно упрощает работу с функциями высшего порядка.
3. Замыкания. Замыкание - это комбинация функции и ее лексического окружения. Замыкания создаются в момент создания функции. Когда функция создается внутри другой функции, то она имеет доступ к переменным, объявленным во внешней функции, даже после того, как будет осуществлен возврат из этой внешней функции.
Список вещей, которые присущи некоторым функциональным языкам и которых нет в JavaScript:
1. Чистота
2. Иммутабельность
3. Рекурсия
Чистота: В JavaScript "чистота" может быть достигнута только по соглашению (т.е. все участники должны договориться использовать только чистые функции). К сожалению, в JavaScript слишком просто сбиться с пути случайно начав создавать и использовать не "чистые" функции.
Иммутабельность: В ФП языках иммутабельность зачастую дана по умолчанию. В JavaScript отсутствуют эффективные структуры данных, используемые в большинстве ФП языков, но существуют библиотеки, которые могут помочь в этом вопросе, например Immutable.js и Mori.
Рекурсия: Технически, JavaScript поддерживает рекурсию, однако большинство функциональных языков имеют такую особенность как "оптимизация хвостовой рекурсии". Такая особенность позволяет рекурсивным функциям переиспользовать фреймы стека для последующих рекурсивных вызовов (фактически рекурсия преобразуется в плоскую итерацию).
👉 @frontendInterview
Если вы опытный разработчик, уже знакомый с JavaScript или с каким-то чисто функциональным языком, то вы можете подумать, что JavaScript это весьма забавный способ открыть для себя мир ФП. В оригинальной статье, автор показывает, почему JS подходит для изучения ФП.
JavaScript имеет в своем составе важные особенности, необходимые для ФП:
1. Функции первого класса. Это возможность использовать функции как данные, т.е. передавать функции в качестве входных параметров, возвращать функции и присваивать функции переменным и свойствам объектов.
2. Анонимные функции и лямбда-синтаксис. Например, запись вида x => x * 2 является валидным выражением в JavaScript. Такой синтаксис значительно упрощает работу с функциями высшего порядка.
3. Замыкания. Замыкание - это комбинация функции и ее лексического окружения. Замыкания создаются в момент создания функции. Когда функция создается внутри другой функции, то она имеет доступ к переменным, объявленным во внешней функции, даже после того, как будет осуществлен возврат из этой внешней функции.
Список вещей, которые присущи некоторым функциональным языкам и которых нет в JavaScript:
1. Чистота
2. Иммутабельность
3. Рекурсия
Чистота: В JavaScript "чистота" может быть достигнута только по соглашению (т.е. все участники должны договориться использовать только чистые функции). К сожалению, в JavaScript слишком просто сбиться с пути случайно начав создавать и использовать не "чистые" функции.
Иммутабельность: В ФП языках иммутабельность зачастую дана по умолчанию. В JavaScript отсутствуют эффективные структуры данных, используемые в большинстве ФП языков, но существуют библиотеки, которые могут помочь в этом вопросе, например Immutable.js и Mori.
Рекурсия: Технически, JavaScript поддерживает рекурсию, однако большинство функциональных языков имеют такую особенность как "оптимизация хвостовой рекурсии". Такая особенность позволяет рекурсивным функциям переиспользовать фреймы стека для последующих рекурсивных вызовов (фактически рекурсия преобразуется в плоскую итерацию).
👉 @frontendInterview
❤9👍4🔥2
React 18 Design Patterns and Best Practices: Design, build, and deploy production-ready web applications with ease and create powerful user experiences, 4th Edition (2023)
Книга состоит из трех частей: в первой вы узнаете об основах паттернов React, во второй погрузитесь во внутреннюю работу React, а в третьей сосредоточитесь на практическом применении. Все примеры кода обновлены в соответствии с последней версией React, а также добавлены новые возможности React 18 и Node 18, архитектура MonoRepo и обширная глава по TypeScript.
👉 @frontendInterview
Книга состоит из трех частей: в первой вы узнаете об основах паттернов React, во второй погрузитесь во внутреннюю работу React, а в третьей сосредоточитесь на практическом применении. Все примеры кода обновлены в соответствии с последней версией React, а также добавлены новые возможности React 18 и Node 18, архитектура MonoRepo и обширная глава по TypeScript.
👉 @frontendInterview
🔥11
Capitals first!
Создайте функцию, которая принимает строку и перемещает все слова, начинающиеся с заглавной буквы в начало строки.
Пример:
👉 @frontendInterview
Создайте функцию, которая принимает строку и перемещает все слова, начинающиеся с заглавной буквы в начало строки.
Пример:
capitalsFirst("hey You, Sort me Already!")
// "You, Sort Already! hey me"👉 @frontendInterview
👍1
Как работает сборка мусора в JS?
Управление памятью в JavaScript выполняется автоматически и незаметно. Мы создаём примитивы, объекты, функции… Всё это занимает память.
Но что происходит, когда что-то больше не нужно? Как движок JavaScript обнаруживает, что пора очищать память?
Основной концепцией управления памятью в JavaScript является принцип достижимости.
Если упростить, то «достижимые» значения – это те, которые доступны или используются. Они гарантированно находятся в памяти.
1. Существует базовое множество достижимых значений, которые не могут быть удалены.
Например:
- Выполняемая в данный момент функция, её локальные переменные и параметры.
- Другие функции в текущей цепочке вложенных вызовов, их локальные переменные и параметры.
- Глобальные переменные.
- (некоторые другие внутренние значения)
Эти значения мы будем называть корнями.
2. Любое другое значение считается достижимым, если оно доступно из корня по ссылке или по цепочке ссылок.
Например, если в глобальной переменной есть объект, и он имеет свойство, в котором хранится ссылка на другой объект, то этот объект считается достижимым. И те, на которые он ссылается, тоже достижимы. Далее вы познакомитесь с подробными примерами на эту тему.
В движке JavaScript есть фоновый процесс, который называется сборщиком мусора. Он отслеживает все объекты и удаляет те, которые стали недоступными.
👉 @frontendInterview
Управление памятью в JavaScript выполняется автоматически и незаметно. Мы создаём примитивы, объекты, функции… Всё это занимает память.
Но что происходит, когда что-то больше не нужно? Как движок JavaScript обнаруживает, что пора очищать память?
Основной концепцией управления памятью в JavaScript является принцип достижимости.
Если упростить, то «достижимые» значения – это те, которые доступны или используются. Они гарантированно находятся в памяти.
1. Существует базовое множество достижимых значений, которые не могут быть удалены.
Например:
- Выполняемая в данный момент функция, её локальные переменные и параметры.
- Другие функции в текущей цепочке вложенных вызовов, их локальные переменные и параметры.
- Глобальные переменные.
- (некоторые другие внутренние значения)
Эти значения мы будем называть корнями.
2. Любое другое значение считается достижимым, если оно доступно из корня по ссылке или по цепочке ссылок.
Например, если в глобальной переменной есть объект, и он имеет свойство, в котором хранится ссылка на другой объект, то этот объект считается достижимым. И те, на которые он ссылается, тоже достижимы. Далее вы познакомитесь с подробными примерами на эту тему.
В движке JavaScript есть фоновый процесс, который называется сборщиком мусора. Он отслеживает все объекты и удаляет те, которые стали недоступными.
👉 @frontendInterview
👍15
Каков результат исполнения кода?
Anonymous Quiz
22%
undefined is 30 и John is 30
26%
John is 30 и John is 30
5%
function и function
47%
John is 30 и function
❤8👎2👍1
Что такое пулреквест и как его сделать на GitHub?
Суть пулреквеста — создать запрос на внесение изменений в репозиторий. Обычно такой запрос сопровождается отзывом (ревью) со стороны других пользователей репозитория, обладающих правами на внесение изменений.
Для того, чтобы сделать пулреквест, нужно создать отдельную ветку и внести все правки именно в неё. Название ветки можно выбрать произвольным образом, но лучше отразить суть изменений в нескольких английских словах, перечисленных через знак переноса (-). Например, чтобы внести изменения (пофиксить), можно использовать слово fix или hotfix (для срочных изменений) в качестве первого слова:
Далее вас перекинет на страницу с настройками будущего пулреквеста. На ней можете добавить название и описать изменения, выбрать ветку, в которую хотите внести изменения (по умолчанию выбирается ветка, из которой создавали текущую ветку с изменениями) или связать ваш запрос с текущими нуждами.
👉 @frontendInterview
Суть пулреквеста — создать запрос на внесение изменений в репозиторий. Обычно такой запрос сопровождается отзывом (ревью) со стороны других пользователей репозитория, обладающих правами на внесение изменений.
Для того, чтобы сделать пулреквест, нужно создать отдельную ветку и внести все правки именно в неё. Название ветки можно выбрать произвольным образом, но лучше отразить суть изменений в нескольких английских словах, перечисленных через знак переноса (-). Например, чтобы внести изменения (пофиксить), можно использовать слово fix или hotfix (для срочных изменений) в качестве первого слова:
git checkout -b hotfix
Эта команда создаст ветку с именем hotfix, и Git переключит репозиторий на новую ветку. Теперь можно вносить изменения с помощью коммитов, например: git commit -m 'Вносит правки в описание'
Когда все правки внесены, необходимо отправить изменения на GitHub. Для этого нужно выполнить команду: git push -u origin hotfix
После этого нужно перейти на сайт GitHub и зайти там в репозиторий. Сверху появится сообщение на жёлтом фоне, в котором вам предложат создать пулреквест. Можно нажать кнопку «Compare & pull request» в этом сообщении или создать пулреквест «вручную» на странице со списком пулреквестов с помощью кнопки «New pull request»Далее вас перекинет на страницу с настройками будущего пулреквеста. На ней можете добавить название и описать изменения, выбрать ветку, в которую хотите внести изменения (по умолчанию выбирается ветка, из которой создавали текущую ветку с изменениями) или связать ваш запрос с текущими нуждами.
👉 @frontendInterview
👍8🔥1