Например, HTTP/1.1 и HTTP/2 работают через TCP, обеспечивая надёжную доставку данных, а HTTP/3 использует QUIC поверх UDP, что позволяет уменьшить задержки и ускорить загрузку страниц.
На картинке показано, какие популярные протоколы используют TCP, а какие работают через UDP, а также как устроены соединения в современных веб-технологиях.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5❤4
Сортировка строк без ручных костылей!
Обычный
Для более понятной сортировки в JS есть
Опция
А
🔥 Полезно для таблиц, списков файлов, версий, артикулов, поиска, сортировки товаров и любого UI, где важен естественный порядок сортировки.
📣 JS Ready | #совет
Обычный
sort() сортирует строки лексикографически, поэтому числа внутри строк идут не так, как ожидает пользователь.['file2', 'file10', 'file1'].sort();
// ['file1', 'file10', 'file2']
Для более понятной сортировки в JS есть
Intl.Collator.const collator = new Intl.Collator('ru', {
numeric: true
});Опция
numeric: true заставляет сравнивать числа внутри строк как числа, а не как символы.['v2', 'v10', 'v1'].sort(collator.compare);
// ['v1', 'v2', 'v10']
А
sensitivity: 'base' помогает не цепляться к регистру и мелким различиям при сравнении.new Intl.Collator('ru', {
sensitivity: 'base'
});Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤6🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собрана большая коллекция полезных ссылок для разработчиков: учебники, документация, статьи, блоги, инструменты, библиотеки и сервисы по JavaScript, HTML, CSS, React, Node.js и другим технологиям веб-разработки. Всё удобно структурировано по категориям, что позволяет быстро находить нужные материалы для изучения или работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤7👍5
Object.hasOwn() — способ проверить, есть ли у объекта собственное свойство!
Чаще всего для этого используют
Способ рабочий, но есть один нюанс.
Именно поэтому долгое время надёжным вариантом считался вызов через прототип:
Такой код работает корректно независимо от содержимого объекта, но выглядит довольно громоздко. Сейчас для этой задачи есть отдельный метод:
По сути это более удобная запись той же проверки. Особенно полезен
У таких объектов метода
Ещё один пример — необходимость отличить собственные свойства от унаследованных:
Хотя доступ к
По этой же причине
🔥 Если нужно проверить наличие свойства именно у объекта, а не где-то в его прототипной цепочке,
📣 JS Ready | #практика
Чаще всего для этого используют
hasOwnProperty():const user = {
name: "Анна"
};
console.log(user.hasOwnProperty("name")); // true
Способ рабочий, но есть один нюанс.
hasOwnProperty — обычный метод объекта. Если он был переопределён, результат проверки уже может оказаться неожиданным.const user = {
name: "Анна",
hasOwnProperty: () => false
};
console.log(user.hasOwnProperty("name")); // false
Именно поэтому долгое время надёжным вариантом считался вызов через прототип:
const user = {
name: "Анна"
};
console.log(
Object.prototype.hasOwnProperty.call(user, "name")
); // true
Такой код работает корректно независимо от содержимого объекта, но выглядит довольно громоздко. Сейчас для этой задачи есть отдельный метод:
const user = {
name: "Анна"
};
console.log(
Object.hasOwn(user, "name")
); // true
По сути это более удобная запись той же проверки. Особенно полезен
Object.hasOwn() при работе с объектами без прототипа:const cache = Object.create(null);
cache.users = [];
console.log(
Object.hasOwn(cache, "users")
); // true
У таких объектов метода
hasOwnProperty нет вовсе:const cache = Object.create(null);
console.log(cache.hasOwnProperty);
// undefined
Ещё один пример — необходимость отличить собственные свойства от унаследованных:
const user = {
name: "Анна"
};
console.log(
Object.hasOwn(user, "toString")
); // false
Хотя доступ к
toString есть, само свойство находится в прототипе.По этой же причине
Object.hasOwn() нередко используют внутри for...in, чтобы обрабатывать только собственные свойства объекта.for (const key in data) {
if (Object.hasOwn(data, key)) {
console.log(key);
}
}
Object.hasOwn() сегодня является самым понятным и читаемым решением.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6❤5🤝3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍6🤝5😁1
Например, Load Balancer распределяет запросы между несколькими серверами, а API Gateway управляет доступом к API, маршрутизацией и ограничением запросов.
На картинке — основные различия между двумя важными компонентами современной микросервисной архитектуры.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥4
Красивый диапазон дат без ручной склейки!
Очень частая задача в интерфейсе: показать период акции, бронь, событие или дедлайн.
Обычно начинают собирать строку руками:
Но так быстро появляются проблемы с локалями, месяцами и повторяющимися частями даты.
В JS есть нативный метод
Он сам форматирует диапазон по правилам выбранной локали.
Если даты в одном месяце, результат будет компактным.
А если диапазон пересекает месяцы — формат тоже останется корректным.
🔥 Очень полезно для календарей, бронирований, акций, расписаний, событий и любого UI, где нужно показывать диапазоны дат без ручного форматирования.
📣 JS Ready | #совет
Очень частая задача в интерфейсе: показать период акции, бронь, событие или дедлайн.
Обычно начинают собирать строку руками:
`${start} - ${end}`Но так быстро появляются проблемы с локалями, месяцами и повторяющимися частями даты.
В JS есть нативный метод
formatRange() у Intl.DateTimeFormat.fmt.formatRange(startDate, endDate)
Он сам форматирует диапазон по правилам выбранной локали.
fmt.formatRange(
new Date('2026-03-10'),
new Date('2026-03-14')
);
Если даты в одном месяце, результат будет компактным.
// 10–14 марта
А если диапазон пересекает месяцы — формат тоже останется корректным.
fmt.formatRange(
new Date('2026-03-30'),
new Date('2026-04-02')
);
// 30 марта – 2 апреля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤝6❤5
Разбираем разницу между Promise.all() и Promise.allSettled()!
Отличия между ними проявляются в момент ошибки. Если использовать
При этом остальные операции не отменяются. Запросы, таймеры и прочая асинхронщина продолжают выполняться. Просто
Когда нужен результат каждой операции независимо от исхода, есть
На выходе получится массив объектов со статусом каждого промиса:
Это удобно для независимых задач. Например, страница загружает профиль пользователя, уведомления и рекомендации. Если рекомендации упали с ошибкой, профиль и уведомления всё равно можно показать. Или пакетная обработка:
После выполнения можно отдельно посмотреть успешные и неуспешные операции, собрать статистику или повторно обработать ошибки.
🔥
📣 JS Ready | #практика
Отличия между ними проявляются в момент ошибки. Если использовать
Promise.all(), то достаточно одного rejected-промиса, чтобы весь результат тоже стал rejected:await Promise.all([
fetchUser(),
fetchPosts(),
fetchComments()
]);
При этом остальные операции не отменяются. Запросы, таймеры и прочая асинхронщина продолжают выполняться. Просто
Promise.all() больше не ждёт общий успешный результат.Когда нужен результат каждой операции независимо от исхода, есть
Promise.allSettled():const results = await Promise.allSettled([
fetchUser(),
fetchPosts(),
fetchComments()
]);
На выходе получится массив объектов со статусом каждого промиса:
[
{ status: "fulfilled", value: {...} },
{ status: "rejected", reason: Error(...) },
{ status: "fulfilled", value: [...] }
]
Это удобно для независимых задач. Например, страница загружает профиль пользователя, уведомления и рекомендации. Если рекомендации упали с ошибкой, профиль и уведомления всё равно можно показать. Или пакетная обработка:
const results = await Promise.allSettled(
users.map(user => sendEmail(user))
);
После выполнения можно отдельно посмотреть успешные и неуспешные операции, собрать статистику или повторно обработать ошибки.
Promise.all() отвечает на вопрос: «Все операции завершились успешно?». Promise.allSettled() отвечает на другой вопрос: «Чем закончилась каждая операция?». Из-за этого они не заменяют друг друга и используются для разных сценариев.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥6❤5
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте собрана большая база материалов для JavaScript-разработчиков: статьи, библиотеки, фреймворки, инструменты, полезные сервисы и обучающие ресурсы. От базовых инструментов до React, Vue, Node.js и др. Отличный ресурс для веб-разработчиков, которые хотят ускорить работу или найти новые инструменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥5
При деструктуризации можно задавать значения по умолчанию — они применяются только когда значение свойства равно undefined (включая случай, когда свойства нет в объекте).
На картинке показано, как работает извлечение значений из объекта person, как подставляются fallback-значения при отсутствии данных, а также разбор кейсов с undefined, null и другими типами значений.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5🤝3
Сидеть и работать в корпорации — страшно, жизнь-то мимо проходит. Уходить строить бизнес — страшно, а вдруг прогорит. Один из вариантов — разрабатывать свой пет-проект по вечерам. Многие успешные компании, например, Twitter, создавались именно так. Это не значит, что ваш проект обязательно заработает миллиарды, но заработать больше, чем в найме, и получить ценный опыт — вполне реально.
Перед началом разработки появляется множество вопросов, например:
• Как выбрать идею для пет-проекта?
• Что нужно знать про маркетинг
• Как запуститься и довести до первых продаж не имея бюджета на рекламу?
В телеграм-канале «Твой пет проект», Михаил Табунов делится своим опытом с разработчиками и менеджерами.
Он рассказывает, где искать идею для нового проекта, что нужно знать о маркетинге, как запустить стартап и привлечь первых 10 клиентов, а также о многих других важных вещах.
Подписывайтесь на «Твой пет проект», получайте пользу от практиков рынка!
https://t.me/+8Frwa03ciVlhNTky
Перед началом разработки появляется множество вопросов, например:
• Как выбрать идею для пет-проекта?
• Что нужно знать про маркетинг
• Как запуститься и довести до первых продаж не имея бюджета на рекламу?
В телеграм-канале «Твой пет проект», Михаил Табунов делится своим опытом с разработчиками и менеджерами.
Он рассказывает, где искать идею для нового проекта, что нужно знать о маркетинге, как запустить стартап и привлечь первых 10 клиентов, а также о многих других важных вещах.
Подписывайтесь на «Твой пет проект», получайте пользу от практиков рынка!
https://t.me/+8Frwa03ciVlhNTky
Telegram
Твой пет проект
Канал про то, как создать свой маленький свечной заводик
Пишу про:
- Запуски и как сделать первые 10 продаж
- Прожарка идей
- Кейсы роста и ведения проекта параллельно с работой
Автор - Михаил Табунов - @bossofyourboss
Связь @to_baza_education
Пишу про:
- Запуски и как сделать первые 10 продаж
- Прожарка идей
- Кейсы роста и ведения проекта параллельно с работой
Автор - Михаил Табунов - @bossofyourboss
Связь @to_baza_education
❤1
Сохраняем причину ошибки без потери контекста!
При обработке и повторном выбрасывании исключений исходный контекст ошибки может быть утерян, что усложняет диагностику.
Раньше приходилось вручную дописывать сообщение:
Так стек и тип исходной ошибки легко теряются.
В JavaScript есть нативный
Теперь верхняя ошибка объясняет контекст, а
Это удобно, когда ошибка проходит через несколько уровней: чтение файла, парсинг JSON, валидация, инициализация приложения.
🔥
📣 JS Ready | #совет
При обработке и повторном выбрасывании исключений исходный контекст ошибки может быть утерян, что усложняет диагностику.
Раньше приходилось вручную дописывать сообщение:
throw new Error('Config loading failed: ' + err.message);Так стек и тип исходной ошибки легко теряются.
В JavaScript есть нативный
Error.cause.throw new Error('Не удалось загрузить конфиг', { cause: err });Теперь верхняя ошибка объясняет контекст, а
cause хранит настоящую причину.error.cause
Это удобно, когда ошибка проходит через несколько уровней: чтение файла, парсинг JSON, валидация, инициализация приложения.
try {
JSON.parse('{bad json}');
} catch (err) {
throw new Error('Config parse failed', { cause: err });
}Error.cause помогает строить цепочки ошибок без склейки строк, потери stack trace и хаоса в логах.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6❤4