Каким образом определяется контекст this внутри стрелочной функции?
Anonymous Quiz
18%
Контекст this всегда ссылается на глобальный объект.
15%
Контекст this определяется тем, как функция была вызвана.
59%
Контекст this наследуется из окружающего контекста (лексический контекст this).
8%
Контекст this всегда равен undefined.
👍15👎8
Highest and Lowest
В этой простой задаче вам дается строка чисел, разделенных пробелами, и вы должны вернуть наибольшее и наименьшее число
Примеры:
👉 @seniorFront
В этой простой задаче вам дается строка чисел, разделенных пробелами, и вы должны вернуть наибольшее и наименьшее число
Примеры:
highAndLow("1 2 3 4 5"); // return "5 1"
highAndLow("1 2 -3 4 5"); // return "5 -3"
highAndLow("1 9 3 4 -5"); // return "9 -5"👉 @seniorFront
👍2
Пишем идеальную mobile-first галерею
Привет, меня зовут Артур, и я люблю плавные интерфейсы, CSS и современные подходы. Сегодня хочу поговорить с вами о задаче, которая настигает, пожалуй, каждого фронтенд разработчика: о создании галереи.
👉 @seniorFront
Привет, меня зовут Артур, и я люблю плавные интерфейсы, CSS и современные подходы. Сегодня хочу поговорить с вами о задаче, которая настигает, пожалуй, каждого фронтенд разработчика: о создании галереи.
👉 @seniorFront
👍7❤1
Какая есть важная особенность у pipe?
Это популярная концепция в программировании, особенно в функциональных языках и библиотеках вроде RxJS (в контексте реактивного программирования). Она используется для последовательного применения функций к данным.
Почему это важно?
Чистота
Композиция
Вместо вложенных вызовов функций (когда результат одной функции передается в другую)
Читаемость
Код становится проще для понимания, особенно если функций много.
Легкость модификации
Можно легко добавлять или удалять шаги в цепочке, не меняя структуру кода.
Как работает pipe?
Пример реализации простого pipe
Использование в RxJS
В контексте RxJS
👉 @seniorFront
Это популярная концепция в программировании, особенно в функциональных языках и библиотеках вроде RxJS (в контексте реактивного программирования). Она используется для последовательного применения функций к данным.
Почему это важно?
Чистота
pipe работает с чистыми функциями, которые не изменяют исходные данные и возвращают новый результат. Это повышает предсказуемость кода.Композиция
Вместо вложенных вызовов функций (когда результат одной функции передается в другую)
pipe упрощает цепочку, делая её линейной.Читаемость
Код становится проще для понимания, особенно если функций много.
Легкость модификации
Можно легко добавлять или удалять шаги в цепочке, не меняя структуру кода.
Как работает pipe?
pipe принимает несколько функций в качестве аргументов и применяет их слева направо к переданным данным. То есть результат одной функции передается как вход в следующую.Пример реализации простого pipe
const pipe = (...functions) => (input) =>
functions.reduce((acc, fn) => fn(acc), input);
// Пример функций
const multiplyByTwo = (num) => num * 2;
const addThree = (num) => num + 3;
const square = (num) => num ** 2;
// Использование pipe
const processNumber = pipe(multiplyByTwo, addThree, square);
console.log(processNumber(5)); // ((5 * 2) + 3) ** 2 = 169
Использование в RxJS
В контексте RxJS
pipe используется для работы с потоками данных, где через него можно передавать операторы, такие как map, filter, mergeMap и другие.import { of } from 'rxjs';
import { map, filter } from 'rxjs/operators';
// Создаем поток данных
const numbers$ = of(1, 2, 3, 4, 5);
// Используем pipe для применения операторов
numbers$
.pipe(
filter((num) => num % 2 === 0), // Оставляем только четные
map((num) => num * 10) // Умножаем их на 10
)
.subscribe((result) => console.log(result));
// Вывод: 20, 40👉 @seniorFront
👍5👎1
Media is too big
VIEW IN TELEGRAM
CSS infinite scroll gallery
Бесконечная галерея картинок, анимированная в CSS. В JS реализован функционал перезапуска положения прокрутки при достижении определенной точки.
👉 @seniorFront
Бесконечная галерея картинок, анимированная в CSS. В JS реализован функционал перезапуска положения прокрутки при достижении определенной точки.
👉 @seniorFront
👍6🔥3
Как стоит оценивать задачи, чтобы улучшить прогнозирование сроков?
Одной из самых частых проблем, с которыми сталкиваются команды, является неточность планирования сроков выполнения задач.
Разработчик говорит: «Это на пару часов». Проходит день, потом два, и выясняется, что в процессе работы всплыли интеграционные проблемы, тестировщики нашли баги, а кто‑то еще ждет согласования. В итоге задача, которую оценили в несколько часов, затягивается на несколько дней или недель.
Почему так происходит? Потому что абсолютные оценки в часах не работают. Они не учитывают неопределенности, возникающие в процессе работы:
- Время на уточнение требований.
- Ожидание обратной связи от аналитиков и заказчиков.
- Время, потраченное на исправление неожиданных проблем.
- Простои между передачами задач из одной команды в другую.
Как же тогда планировать и прогнозировать сроки выполнения задач?
1. Использовать статистику, а не экспертные оценки
Вместо того, чтобы пытаться точно оценить время выполнения каждой задачи, собирайте реальные данные о том, сколько времени занимает выполнение похожих задач.
Как это сделать:
- Фиксируйте, когда задача была взята в работу и когда она реально была завершена (включая тестирование и релиз).
- Отслеживайте не только время разработки, но и задержки, связанные с ожиданием ответов, согласованиями и релизами.
- Разделите задачи по размеру (например, S, M, L, XL) и собирайте статистику по каждому типу.
2. Оценивать задачи не в часах, а в относительных единицах
Когда команда оценивает задачи в часах, это создает иллюзию точности, которая на самом деле приводит к ошибкам. Вместо этого лучше использовать относительные оценки, например:
- Story Points (по ряду Фибоначчи: 1, 2, 3, 5, 8 и так далее).
- Оценку в «футболках» (XS, S, M, L, XL).
Как это работает:
- Находим в бэклоге самую маленькую задачу, принимаем ее за 1 SP (или XS).
- Сравниваем другие задачи с ней и оцениваем их относительно друг друга.
- Планируем спринт и смотрим, сколько SP команда реально завершает за итерацию.
- Через 3–5 спринтов накапливается статистика, на которую можно опираться при планировании.
Таким образом, мы оцениваем не время, а сложность и объем задачи относительно других, что делает прогнозирование более точным.
3. Использовать статистику выполнения прошлых спринтов
Если вы работаете по Scrum, можно анализировать, сколько Story Points команда выполняла в прошлых спринтах.
Как это сделать:
- Фиксируйте скорость команды (Velocity) — среднее количество выполненных SP за спринт.
- Учитывайте тенденции — если команда стабильно делает 30 SP за спринт, то планировать на следующий спринт 50 SP бессмысленно.
- Анализируйте вариативность — насколько часто сроки отклонялись от запланированных, какие были причины.
Когда у вас есть такие данные, можно с высокой точностью прогнозировать, что реально успеет сделать команда в следующем спринте.
👉 @seniorFront
Одной из самых частых проблем, с которыми сталкиваются команды, является неточность планирования сроков выполнения задач.
Разработчик говорит: «Это на пару часов». Проходит день, потом два, и выясняется, что в процессе работы всплыли интеграционные проблемы, тестировщики нашли баги, а кто‑то еще ждет согласования. В итоге задача, которую оценили в несколько часов, затягивается на несколько дней или недель.
Почему так происходит? Потому что абсолютные оценки в часах не работают. Они не учитывают неопределенности, возникающие в процессе работы:
- Время на уточнение требований.
- Ожидание обратной связи от аналитиков и заказчиков.
- Время, потраченное на исправление неожиданных проблем.
- Простои между передачами задач из одной команды в другую.
Как же тогда планировать и прогнозировать сроки выполнения задач?
1. Использовать статистику, а не экспертные оценки
Вместо того, чтобы пытаться точно оценить время выполнения каждой задачи, собирайте реальные данные о том, сколько времени занимает выполнение похожих задач.
Как это сделать:
- Фиксируйте, когда задача была взята в работу и когда она реально была завершена (включая тестирование и релиз).
- Отслеживайте не только время разработки, но и задержки, связанные с ожиданием ответов, согласованиями и релизами.
- Разделите задачи по размеру (например, S, M, L, XL) и собирайте статистику по каждому типу.
2. Оценивать задачи не в часах, а в относительных единицах
Когда команда оценивает задачи в часах, это создает иллюзию точности, которая на самом деле приводит к ошибкам. Вместо этого лучше использовать относительные оценки, например:
- Story Points (по ряду Фибоначчи: 1, 2, 3, 5, 8 и так далее).
- Оценку в «футболках» (XS, S, M, L, XL).
Как это работает:
- Находим в бэклоге самую маленькую задачу, принимаем ее за 1 SP (или XS).
- Сравниваем другие задачи с ней и оцениваем их относительно друг друга.
- Планируем спринт и смотрим, сколько SP команда реально завершает за итерацию.
- Через 3–5 спринтов накапливается статистика, на которую можно опираться при планировании.
Таким образом, мы оцениваем не время, а сложность и объем задачи относительно других, что делает прогнозирование более точным.
3. Использовать статистику выполнения прошлых спринтов
Если вы работаете по Scrum, можно анализировать, сколько Story Points команда выполняла в прошлых спринтах.
Как это сделать:
- Фиксируйте скорость команды (Velocity) — среднее количество выполненных SP за спринт.
- Учитывайте тенденции — если команда стабильно делает 30 SP за спринт, то планировать на следующий спринт 50 SP бессмысленно.
- Анализируйте вариативность — насколько часто сроки отклонялись от запланированных, какие были причины.
Когда у вас есть такие данные, можно с высокой точностью прогнозировать, что реально успеет сделать команда в следующем спринте.
👉 @seniorFront
👍3❤1
Сделай удобно: подборка UI/UX-кейсов из цифровых и нецифровых продуктов
Продолжаю изучать различные UI/UX/CX кейсы в мобильных приложениях, веб-сайтах и в реальном мире. Дизайнерам и менеджерам по продукту, чтобы вдохновиться и добавить в заметки.
Под катом: N26, Glovo, Flowwow, Intsargam.
👉 @seniorFront
Продолжаю изучать различные UI/UX/CX кейсы в мобильных приложениях, веб-сайтах и в реальном мире. Дизайнерам и менеджерам по продукту, чтобы вдохновиться и добавить в заметки.
Под катом: N26, Glovo, Flowwow, Intsargam.
👉 @seniorFront
👍3👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Logo Factory
Свёрстано на HTML и SCSS. Функционал рисования лого, а также скачивание результата реализованы в JS.
👉 @seniorFront
Свёрстано на HTML и SCSS. Функционал рисования лого, а также скачивание результата реализованы в JS.
👉 @seniorFront
❤3👍2🔥2👎1
Media is too big
VIEW IN TELEGRAM
Keyboard
В этом видео создается реалистичная клавиатура на CSS и чистом JS, которая отображает нажатые клавиши в данный момент.
👉 @seniorFront
В этом видео создается реалистичная клавиатура на CSS и чистом JS, которая отображает нажатые клавиши в данный момент.
👉 @seniorFront
👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Sticky Navigation
Свёрстано с использованием препроцессоров Pug и SCSS. Функционал плавной прокрутки реализован в JS.
👉 @seniorFront
Свёрстано с использованием препроцессоров Pug и SCSS. Функционал плавной прокрутки реализован в JS.
👉 @seniorFront
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Fluid Simulation With Your Text
Реализовано на canvas и чистом JS с использованием технологии WebGL
👉 @seniorFront
Реализовано на canvas и чистом JS с использованием технологии WebGL
👉 @seniorFront
👍5🔥1
Какой принцип ООП позволяет методам выполнять разные действия в зависимости от объекта, который вызывает этот метод?
Anonymous Quiz
11%
Инкапсуляция.
23%
Наследование.
57%
Полиморфизм.
9%
Абстракция.
👍5❤2
Media is too big
VIEW IN TELEGRAM
Scroll To Text Reveal Effect
В этом видео создается эффект проявления текста при прокрутке на JS.
👉 @seniorFront
В этом видео создается эффект проявления текста при прокрутке на JS.
👉 @seniorFront
🔥4👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Filter on image vs gradient backgrounds
Слева находится анимированная SVG картинка, а справа блок с множеством градиентов, наложенных через CSS.
👉 @seniorFront
Слева находится анимированная SVG картинка, а справа блок с множеством градиентов, наложенных через CSS.
👉 @seniorFront
👍4🔥1
Counting Duplicates
Напишите функцию, которая будет возвращать количество символов, встречающихся во входной строке более одного раза без учета регистра. Предполагается, что входная строка содержит только прописные и строчные буквы, а также цифры.
Пример:
Напишите функцию, которая будет возвращать количество символов, встречающихся во входной строке более одного раза без учета регистра. Предполагается, что входная строка содержит только прописные и строчные буквы, а также цифры.
Пример:
"abcde" -> 0 # no characters repeats more than once
"aabbcde" -> 2 # 'a' and 'b'
"aabBcde" -> 2 # 'a' occurs twice and 'b' twice (`b` and `B`)
"indivisibility" -> 1 # 'i' occurs six times
"Indivisibilities" -> 2 # 'i' occurs seven times and 's' occurs twice
"aA11" -> 2 # 'a' and '1'
"ABBA" -> 2 # 'A' and 'B' each occur twice
Я делаю рефакторинг ежечасно» или как за пять минут улучшить приложение
История этой статьи началась с того, что я вспомнил о довольно известном высказывании Мартина Фаулера, автора книг и статей по архитектуре ПО, которое нередко вызывает недопонимание (во всяком случае так было у меня) — «Я делаю рефакторинг ежечасно». Первая мысль, которая логично возникает после этого высказывания — уважаемый публицист просто лукавит. Вторая — что, наверное, кроме рефакторинга он в своей жизни ничем больше не занимается. Но так ли это?
👉 @seniorFront
История этой статьи началась с того, что я вспомнил о довольно известном высказывании Мартина Фаулера, автора книг и статей по архитектуре ПО, которое нередко вызывает недопонимание (во всяком случае так было у меня) — «Я делаю рефакторинг ежечасно». Первая мысль, которая логично возникает после этого высказывания — уважаемый публицист просто лукавит. Вторая — что, наверное, кроме рефакторинга он в своей жизни ничем больше не занимается. Но так ли это?
👉 @seniorFront
👍3
😡 Устал от нудных уроков на YouTube, где половина — вода?
Хватит это терпеть) Автор канала Формошлёп убрал воду и оставил только суть:
➧ Мини-гайды по HTML, CSS и JavaScript, которые легко читать и сразу применять.
➧ Шпаргалки, лайфхаки и полезные советы с ноткой юмора.
➧ Всё чётко, лаконично и по делу.
Неважно, новичок ты или фронтендер на опыте — у нас всегда найдётся что-то полезное!
Присоединяйся: @frontbox будем вместе шлёпать формы и красить кнопки)
Хватит это терпеть) Автор канала Формошлёп убрал воду и оставил только суть:
➧ Мини-гайды по HTML, CSS и JavaScript, которые легко читать и сразу применять.
➧ Шпаргалки, лайфхаки и полезные советы с ноткой юмора.
➧ Всё чётко, лаконично и по делу.
Неважно, новичок ты или фронтендер на опыте — у нас всегда найдётся что-то полезное!
Присоединяйся: @frontbox будем вместе шлёпать формы и красить кнопки)
👎4👍2
Зачем придумали async/await?
Ключевой целью введения
Улучшение читаемости кода
Асинхронный код, написанный с использованием коллбеков или промисов, может быть трудным для чтения и понимания, особенно когда имеется несколько вложенных асинхронных операций.
Пример с промисами:
Пример с async/await:
Избегание "ада коллбеков"
Когда асинхронные операции вложены друг в друга, код становится трудным для чтения и сопровождения. Это называется "адом коллбеков" (callback hell).
Пример с промисами:
Пример с async/await:
Снижение вероятности ошибок
Когда используется
Пример с промисами:
Пример с async/await:
👉 @seniorFront
Ключевой целью введения
async/await в JavaScript было упростить написание и чтение асинхронного кода, сделать его более линейным и похожим на синхронный. Улучшение читаемости кода
Асинхронный код, написанный с использованием коллбеков или промисов, может быть трудным для чтения и понимания, особенно когда имеется несколько вложенных асинхронных операций.
async/await делает асинхронный код более линейным, что упрощает его понимание.Пример с промисами:
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("some data");
}, 1000);
});
}
fetchData().then((data) => {
console.log(data);
}).catch((error) => {
console.error(error);
});Пример с async/await:
async function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("some data");
}, 1000);
});
}
async function main() {
try {
const data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
main();Избегание "ада коллбеков"
Когда асинхронные операции вложены друг в друга, код становится трудным для чтения и сопровождения. Это называется "адом коллбеков" (callback hell).
async/await позволяет писать асинхронный код последовательно, без вложенности.Пример с промисами:
getData((data) => {
processData(data, (processedData) => {
saveData(processedData, (result) => {
console.log(result);
});
});
});Пример с async/await:
async function main() {
try {
const data = await getData();
const processedData = await processData(data);
const result = await saveData(processedData);
console.log(result);
} catch (error) {
console.error(error);
}
}
main();Снижение вероятности ошибок
Когда используется
async/await, ошибки могут быть обработаны с использованием привычного try/catch блока, что снижает вероятность пропуска ошибок.Пример с промисами:
fetchData().then((data) => {
return processData(data);
}).then((processedData) => {
return saveData(processedData);
}).catch((error) => {
console.error(error);
});Пример с async/await:
async function main() {
try {
const data = await fetchData();
const processedData = await processData(data);
const result = await saveData(processedData);
console.log(result);
} catch (error) {
console.error(error);
}
}
main();👉 @seniorFront
👍3👎3