Проверка условий в массиве без явного цикла!
Когда нужно проверить элементы массива, многие пишут цикл и флаги:
В JS для таких проверок есть нативные методы —
Метод
Метод
Оба метода прекращают перебор, как только результат становится понятен, поэтому код получается короче и читаемее.
🔥 Особенно полезно при валидации данных, проверке прав доступа и любой логике, где нужно быстро проверить условие для массива.
📣 Code Ready | #совет
Когда нужно проверить элементы массива, многие пишут цикл и флаги:
let hasEven = false;
for (const n of numbers) {
if (n % 2 === 0) {
hasEven = true;
break;
}
}
В JS для таких проверок есть нативные методы —
some() и every(), которые позволяют обойтись без явного цикла.Метод
some() проверяет, выполняется ли условие хотя бы для одного элемента массива:const hasEven = numbers.some(n => n % 2 === 0);
Метод
every() проверяет, выполняется ли условие для всех элементов массива:const allEven = numbers.every(n => n % 2 === 0);
Оба метода прекращают перебор, как только результат становится понятен, поэтому код получается короче и читаемее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍12🔥11
Как читать элементы массива с конца через at()!
Раньше доступ к элементам с конца массива требовал ручных вычислений длины и это ухудшало читаемость кода.
Например, чтобы получить последний и предпоследний элементы, обычно писали так.
Традиционный способ:
При сложных выражениях или частых обращениях к последним элементам такой код становится менее читаемым.
Современный метод at() позволяет обращаться к элементам массива с конца через отрицательные индексы:
Метод также поддерживает обычные положительные индексы:
Если индекс выходит за пределы массива, метод возвращает undefined:
Один из практических сценариев — работа со стеком, когда нужно быстро посмотреть верхний элемент:
Метод работает не только с массивами, но и со строками:
В отличие от charAt(), метод at() поддерживает отрицательные индексы.
Он также доступен для TypedArray:
🔥 Важно: at() не мутирует данные и не создаёт копий — это просто способ получить элемент по индексу. Метод поддерживается современными браузерами и современными версиями Node.js.
📣 Code Ready | #практика
Раньше доступ к элементам с конца массива требовал ручных вычислений длины и это ухудшало читаемость кода.
Например, чтобы получить последний и предпоследний элементы, обычно писали так.
Традиционный способ:
const arr = ["a", "b", "c", "d"];
const last = arr[arr.length - 1];
const prev = arr[arr.length - 2];
console.log(last); // "d"
console.log(prev); // "c"
При сложных выражениях или частых обращениях к последним элементам такой код становится менее читаемым.
Современный метод at() позволяет обращаться к элементам массива с конца через отрицательные индексы:
const arr = ["a", "b", "c", "d"];
arr.at(-1); // "d"
arr.at(-2); // "c"
Метод также поддерживает обычные положительные индексы:
arr.at(0); // "a"
arr.at(2); // "c"
Если индекс выходит за пределы массива, метод возвращает undefined:
arr.at(100); // undefined
arr.at(-100); // undefined
Один из практических сценариев — работа со стеком, когда нужно быстро посмотреть верхний элемент:
function peek(stack) {
return stack.at(-1);
}Метод работает не только с массивами, но и со строками:
"hello".at(-1); // "o"
В отличие от charAt(), метод at() поддерживает отрицательные индексы.
Он также доступен для TypedArray:
const bytes = new Uint8Array([10, 20, 30]);
bytes.at(-1); // 30
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤15🤝10
This media is not supported in your browser
VIEW IN TELEGRAM
Задача — в минимуме кода повторить заданный визуал. Тренирует знание CSS до автоматизма, особенно круто для тех, кто хочет прокачать вёрстку нестандартных форм.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥9🤝9❤4
Иногда обычной рамки недостаточно — элементу не хватает динамики и акцента. В этом приёме граница становится анимированной и вращается вокруг элемента.
Как работает:
• conic-gradient формирует круговой градиент;
• псевдоэлемент выносится за пределы карточки через inset;
• анимация вращает слой через transform, не затрагивая layout;
• вся интерактивность реализована без скриптов.
Градиент вынесен в отдельный слой, поэтому эффект не влияет на содержимое карточки и может переиспользоваться как независимый декоративный уровень.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍10🤝10❤1
This media is not supported in your browser
VIEW IN TELEGRAM
ES7+ React/Redux/React-Native snippets — добавляет готовые сниппеты для компонентов, хуков, Redux-логики и других часто используемых конструкций. Достаточно ввести короткое сокращение и получаешь полноценный шаблон с импортами и структурой. Помогает быстрее создавать файлы, избегая рутины.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤11👍11
Почему “едут” размеры некоторых элементов?
По умолчанию (
Фактическая ширина здесь будет 240px, что часто приводит к переполнениям:
Теперь
Поэтому это правило обычно задают глобально, чтобы вся верстка стала предсказуемой.
🔥 Это снижает количество проблем с размерами и делает layout стабильнее.
📣 Code Ready | #совет
По умолчанию (
box-sizing: content-box) width и height задают только размер контента, без учёта padding и border. Из-за этого элементы становятся больше, чем ожидаешь, и layout ломается:.box {
width: 200px;
padding: 20px;
}Фактическая ширина здесь будет 240px, что часто приводит к переполнениям:
.box {
box-sizing: border-box;
}Теперь
padding и border учитываются внутри заданной ширины, и итоговый размер остаётся 200px:*,
*::before,
*::after {
box-sizing: border-box;
}
Поэтому это правило обычно задают глобально, чтобы вся верстка стала предсказуемой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥13❤11
This media is not supported in your browser
VIEW IN TELEGRAM
Репозиторий с огромной подборкой вопросов от базовых тем до продвинутых концепций. Собраны сотни вопросов по замыканиям, this, event loop, промисам, прототипам, асинхронности и др., которые регулярно встречаются на собеседованиях. Формат простой и удобный: вопрос, ответ, краткое объяснение.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥11❤10
closest(): поиск ближайшего элемента по селектору!
Иногда в обработчике клика вообще не важно, куда именно попали — в текст, иконку или вложенный span. Важно — к какому элементу это всё относится. В таких случаях обычно выручает
Он берёт текущий элемент (
Самый простой пример:
Если клик был внутри кнопки — получим её. Если нет — вернётся null.
Чаще всего это используют в делегировании событий. Например, список:
Без
Хорошо видно на вложенных элементах:
Клик может прийтись в svg, span, что угодно внутри кнопки — логика от этого не ломается.
Иногда добавляют ещё проверку на контейнер:
Это не всегда обязательно, но полезно, если одинаковые селекторы встречаются в разных частях страницы.
Ещё момент, который иногда забывают: если элемент уже подходит под селектор,
🔥 Очевидное, но всё же: селектор должен быть валидным, иначе будет ошибка. В итоге — небольшая штука, но сильно упрощает жизнь, когда работаешь с событиями и вложенной разметкой.
📣 Code Ready | #практика
Иногда в обработчике клика вообще не важно, куда именно попали — в текст, иконку или вложенный span. Важно — к какому элементу это всё относится. В таких случаях обычно выручает
Element.closest().Он берёт текущий элемент (
event.target) и поднимается вверх по DOM, пока не найдёт первый узел, который подходит под CSS-селектор. Причём проверяет и сам элемент тоже.Самый простой пример:
const button = event.target.closest('.btn');
Если клик был внутри кнопки — получим её. Если нет — вернётся null.
Чаще всего это используют в делегировании событий. Например, список:
document.addEventListener('click', (e) => {
const item = e.target.closest('.list-item');
if (!item) return;
console.log('clicked:', item.dataset.id);
});
Без
closest() здесь обычно начинается проверка e.target, потом parentElement, потом ещё выше — и код быстро превращается в цепочку условий. С closest() это одна строка.Хорошо видно на вложенных элементах:
document.addEventListener('click', (e) => {
const button = e.target.closest('button[data-action]');
if (!button) return;
handleAction(button.dataset.action);
});
Клик может прийтись в svg, span, что угодно внутри кнопки — логика от этого не ломается.
Иногда добавляют ещё проверку на контейнер:
const container = document.querySelector('.container');
container.addEventListener('click', (e) => {
const item = e.target.closest('.item');
if (!item || !container.contains(item)) return;
console.log('inside container');
});
Это не всегда обязательно, но полезно, если одинаковые селекторы встречаются в разных частях страницы.
Ещё момент, который иногда забывают: если элемент уже подходит под селектор,
closest() вернёт его же.const el = document.querySelector('.card');
console.log(el.closest('.card') === el); // true
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥12❤9🤝3
Например,
array.push() изменяет исходный массив, а [...array, item] — создаёт новый без мутации. То же самое с sort(), reverse() и другими — у них есть безопасные аналоги вроде toSorted() и toReversed().На картинке — 9 мутирующих методов и их иммутабельные альтернативы, которые стоит держать под рукой при работе с массивами.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍16🔥11
Последовательные async-операции без лишней вложенности!
Когда несколько асинхронных действий зависят друг от друга, часто пишут вложенные
Такой код быстро превращается в избыточную вложенность обработчиков.
Решение — возвращать следующий Promise из
Каждый
Ошибки ловятся централизованно в
Важно:
🔥 Такой паттерн делает асинхронный код линейным, убирает лишнюю вложенность и упрощает поддержку.
📣 Code Ready | #совет
Когда несколько асинхронных действий зависят друг от друга, часто пишут вложенные
.then():fetch('/data').then(r => {
r.json().then(data => {
fetch(`/more/${data.id}`).then(r2 => {
r2.json().then(console.log);
});
});
});Такой код быстро превращается в избыточную вложенность обработчиков.
Решение — возвращать следующий Promise из
.then():fetch('/data')
.then(r => r.json())
.then(data => fetch(`/more/${data.id}`))Каждый
.then() получает результат предыдущего и передаёт дальше по цепочке, потому что возвращает Promise:.then(r => r.json())
.then(console.log)
Ошибки ловятся централизованно в
.catch(), если они произошли в цепочке или внутри .then():.catch(console.error);
Важно:
fetch не кидает ошибку на HTTP 4xx/5xx — в реальном коде проверяйте r.ok.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤12🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собраны основные конструкции JS с готовыми примерами кода. Переменные, циклы, условия, массивы, строки, события, работа с датами и даже регулярные выражения. Главная фишка — это интерактивность: можно сразу копировать код, скрывать комментарии и использовать сайт как быстрый справочник во время работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20👍16🔥11👎1
Доступ к вложенным свойствам по строке!
Иногда путь к данным приходит динамически: из конфигурации, формы или API. Писать доступ вручную в таких случаях невозможно.
Если ключ хранится строкой, можно превратить его в универсальный доступ через
Каждый шаг берёт текущее значение и читает следующий ключ из пути:
А
Если на каком-то уровне свойства нет,
Подход работает для простых путей через точку (a.b.c).
🔥 Это пригодится для dynamic access, form builders, JSON-парсеров, таблиц, конфигов и любых систем, где путь к данным неизвестен заранее.
📣 Code Ready | #совет
Иногда путь к данным приходит динамически: из конфигурации, формы или API. Писать доступ вручную в таких случаях невозможно.
Если ключ хранится строкой, можно превратить его в универсальный доступ через
split + reduce:path.split('.').reduce((o, k) => o?.[k], obj);Каждый шаг берёт текущее значение и читает следующий ключ из пути:
'profile.name'.split('.')
// ['profile', 'name']А
reduce проходит по этому пути и безопасно читает значения:(o, k) => o?.[k]
Если на каком-то уровне свойства нет,
optional chaining вернёт undefined без ошибки.Подход работает для простых путей через точку (a.b.c).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍12🔥11
This media is not supported in your browser
VIEW IN TELEGRAM
doka guide — сайт, на котором собраны шпаргалки по HTML, CSS, JS. На каждую тему есть подробный разбор с полезными советами по применению.
📌 Ссылочка: doka.guide
📣 Code Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍13🤝10❤2
В длинных страницах важно давать пользователю понимание прогресса. Это снижает фрустрацию и делает чтение более предсказуемым.
Как работает:
• animation-timeline: scroll() связывает анимацию с прокруткой;
• transform: scaleX используется как процент прогресса;
• transform-origin: left фиксирует точку роста;
• вся логика реализуется декларативно, без событий scroll.
Это хороший способ заменить JS-обработчики нативными возможностями CSS.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26🤝13👍12❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Polacode — делает скриншоты кода прямо из VS Code: с подсветкой синтаксиса, темой редактора и оформлением. Просто выделяешь код и получаешь готовое изображение для поста, документации или презентации.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍13🤝11❤1
Почему 1fr ведёт себя не так, как ожидается?
Многие думают, что
Если в первой колонке длинный текст или
Решение — явно разрешить колонке сжиматься:
Теперь
Это особенно важно для
🔥 Если используешь
📣 Code Ready | #совет
Многие думают, что
1fr — это занять всё доступное пространство. На практике трек с 1fr часто упирается в минимальный размер контента (min-content) и не сжимается как ожидается..grid {
grid-template-columns: 1fr auto;
}Если в первой колонке длинный текст или
input, она может не сжаться и вытолкнуть вторую колонку.Решение — явно разрешить колонке сжиматься:
.grid {
grid-template-columns: minmax(0, 1fr) auto;
}minmax(0, 1fr) говорит браузеру: колонка может уменьшаться до 0, а не держаться за размер контента.Теперь
ellipsis, overflow и адаптив работают корректно..title {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}Это особенно важно для
layout с заголовками, таблицами, карточками и input-полями.1fr, в большинстве случаев безопаснее писать minmax(0, 1fr) — это избавляет от скрытых багов в grid.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍11❤10🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
В репозитории собраны сотни инструментов и материалов, которые помогают в дизайне: иконки, шрифты, цветовые палитры, иллюстрации, UI-киты, шаблоны, стоковые фото, генераторы, онлайн-инструменты и многое другое. Всё разбито по категориям, можно сразу найти нужный ресурс.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥11🤝10
В интерфейсах часто нужно показать дополнительную информацию при наведении. Проблема в том, что обычное раскрытие ломает
layout и вызывает скачки элементов.Как работает:
• дополнительный слой размещается поверх через position: absolute;
• основной контент остаётся на месте и не участвует в перерасчёте;
• opacity и transform создают плавное появление;
• взаимодействие не влияет на соседние элементы.
Такой подход используют в карточках, таблицах и dashboard-интерфейсах, где важно сохранить стабильность
layout.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤10🔥9