Frontend | Вопросы собесов
Frontend | Вопросы собесов - канал где мы разбираем вопросы с собеседований на Frontend разработчика. У нас вы найдете полезные материалы и обсуждения, связанные с вопросами, которые могут возникнуть на собеседованиях для Frontend разработчиков. Мы предлагаем разнообразные темы, включая JavaScript, HTML, CSS и другие важные аспекты в*-разработки. Присоединяйтесь к нашему каналу в Telegram, чтобы получать регулярные обновления и улучшать свои навыки в Frontend разработке. Мы с нетерпением ждем вас в Frontend | Вопросы собесов!
Публикации канала
🤔 Как проверить правильную иерархию html заголовков? Проверить правильную иерархию HTML-заголовков важно для улучшения доступности (Accessibility) и SEO. Правильная структура заголовков помогает пользователям (включая тех, кто использует скринридеры) и поисковым системам лучше понимать содержание страницы. 🚩Зачем нужна правильная иерархия заголовков? 🟠Логическая структура Заголовки задают структуру страницы, разбивая контент на разделы и подразделы. Это как оглавление книги. 🟠Доступность Люди, использующие вспомогательные технологии (например, скринридеры), полагаются на правильные заголовки для навигации по странице. 🟠SEO Поисковые системы оценивают структуру заголовков для индексации и понимания ключевых тем страницы. 🚩Что значит "правильная иерархия заголовков"? 🟠`<h1>` Заголовок страницы (должен быть уникальным и только один на странице). 🟠`<h2>` Подразделы <h1>. 🟠`<h3>` Подразделы <h2>, и так далее. <h1>Главный заголовок страницы</h1> <h2>Раздел 1</h2> <h3>Подраздел 1.1</h3> <h3>Подраздел 1.2</h3> <h2>Раздел 2</h2> <h3>Подраздел 2.1</h3> <h4>Подраздел 2.1.1</h4> 🚩Как проверить иерархию заголовков? 🟠Ручная проверка HTML-кода Вручную просмотрите HTML-код страницы и убедитесь, что заголовки идут в порядке. Например, <h1> → <h2> → <h3> и так далее, без "перескакивания". Избегайте "пропуска уровней" (например, от <h2> сразу к <h4>). 🟠Использование браузерных DevTools В браузере откройте DevTools (например, в Chrome нажмите F12 или Ctrl+Shift+I). Перейдите на вкладку "Elements" (Элементы). Найдите заголовки (<h1>, <h2> и так далее) и проверьте их последовательность. 🟠Инструменты для проверки доступности Используйте расширения или инструменты для оценки доступности, такие как: Lighthouse (встроено в Chrome DevTools). Выполните аудит доступности и посмотрите рекомендации. WAVE (Web Accessibility Evaluation Tool) — онлайн-инструмент для анализа доступности. Эти инструменты покажут ошибки или пропуски в структуре заголовков. 🟠Скрипт для автоматической проверки Если вы работаете над большим проектом, можно написать скрипт для проверки иерархии заголовков. const headings = [...document.querySelectorAll('h1, h2, h3, h4, h5, h6')]; headings.forEach((heading, index) => { console.log(`${index + 1}: ${heading.tagName} - ${heading.textContent.trim()}`); }); 🟠Плагин для анализа заголовков Для популярных CMS (например, WordPress) существуют плагины, которые проверяют структуру заголовков, например, Yoast SEO. 🚩Примеры ошибок в структуре и как их исправить Ошибка: Пропуск уровней заголовков <h1>Главный заголовок</h1> <h3>Подраздел</h3> <!-- Пропущен <h2> --> Исправление <h1>Главный заголовок</h1> <h2>Подраздел</h2> Ошибка: Несколько <h1> на одной странице <h1>Главный заголовок</h1> <h1>Еще один заголовок</h1> Исправление <h1>Главный заголовок</h1> <h2>Еще один заголовок</h2> Ставь 👍 и забирай 📚 Базу знаний
🧿 Осталось 3 дня, чтобы забрать оберег! Пожизненный easyoffer PRO по цене одного года. Надеваешь один раз и защищён всю жизнь 🎃 От чего защищает оберег: 1. Вопросы и задачи с реальных собеседований в конкретных компаниях — от сюрпризов на собесе 2. Лучшие ответы и видео-примеры от middle/senior специалистов — от ответов уровня джуна 3. Записи реальных собеседований — от страха неизвестности 4. Обход фильтров ATS с топ-30 ключевых слов в резюме — от автоотказов, пришедших из темноты в 3 часа ночи 5. Автоотклики на hh — от бесконечных часов ручных откликов 6. Тренажёры и симуляторы — от дрожи в голосе перед интервьюером 👻 ⏳ Акция действует только до 31 октября 23:59 по МСК 👉 Забрать оберег со скидкой 70%: https://easyoffer.ru/pro
🤔 Чем spa отличается от классического сайта? SPA (Single Page Application) и классический сайт (MPA – Multi Page Application) — это два разных подхода к созданию веб-приложений. Они отличаются по способу загрузки данных, навигации и производительности. 🚩Классический сайт (MPA – Multi Page Application) Каждый раз при переходе на новую страницу браузер запрашивает HTML с сервера. Сервер формирует страницу и отправляет готовый HTML. <?php echo "<h1>Добро пожаловать!</h1>"; ?> <a href="/about">О нас</a> 🚩SPA (Single Page Application) При первом заходе загружается одна HTML-страница и весь JavaScript. Дальше контент подгружается динамически через AJAX или Fetch API. import React, { useState, useEffect } from "react"; function App() { const [data, setData] = useState(null); useEffect(() => { fetch("/api/products") .then(res => res.json()) .then(data => setData(data)); }, []); return <div>{data ? JSON.stringify(data) : "Загрузка..."}</div>; } export default App; Ставь 👍 и забирай 📚 Базу знаний
🤔 Почему нельзя использовать контекст в качестве хранилища состояния? Контекст (React Context) не предназначен для частых обновлений. Он хорош для неизменяемых или редко меняемых данных (например, тема, язык). При каждом изменении контекста перерендериваются все потребители, что может вызвать проблемы с производительностью. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Расскажи про области видимости В JavaScript область видимости (scope) определяет доступность переменных, функций и объектов в разных частях кода. Это фундаментальная концепция, которая управляет тем, какие данные могут быть доступны или недоступны в различных частях программы. 🚩Глобальная область видимости Переменные и функции, объявленные вне любых функций или блоков, находятся в глобальной области видимости. Они доступны из любой части программы. var globalVar = 'Я глобальная переменная'; function testFunction() { console.log(globalVar); // Доступно } testFunction(); console.log(globalVar); // Доступно 🚩Функциональная область видимости Переменные, объявленные с помощью var внутри функции, имеют область видимости, ограниченную этой функцией. Они недоступны за её пределами. function testFunction() { var functionVar = 'Я внутри функции'; console.log(functionVar); // Доступно } testFunction(); console.log(functionVar); // Ошибка: переменная functionVar недоступна 🚩Блочная область видимости Переменные, объявленные с помощью let и const, имеют область видимости, ограниченную ближайшим блоком {}. if (true) { let blockVar = 'Я внутри блока'; console.log(blockVar); // Доступно } console.log(blockVar); // Ошибка: переменная blockVar недоступна 🚩Область видимости модуля (Module Scope) При использовании модулей (например, import и export в ES6), все переменные и функции в модуле имеют собственную область видимости. Они не попадают в глобальную область видимости. export const myVar = 'Я переменная из модуля'; import { myVar } from './module1.js'; console.log(myVar); // "Я переменная из модуля" Ставь 👍 и забирай 📚 Базу знаний
🤔 Зачем нужна система контроля версий? Она отслеживает изменения в коде, позволяет откатываться, работать в команде, создавать ветки для разных задач, решать конфликты, сохранять историю и документировать прогресс. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Что такое async и await? Это синтаксический сахар для работы с асинхронными операциями, делающий код, работающий с асинхронными действиями, такими как запросы к серверу или чтение файлов, более читаемым и легким для понимания. Этот синтаксис был введен в ES2017 (ES8) и строится на промисах (Promises). 🚩Ключевое слово async Используется перед объявлением функции. Это позволяет функции автоматически возвращать промис. Если эта функция возвращает не промис, то возвращаемое значение будет автоматически обернуто в промис. async function fetchData() { return 'данные'; } fetchData().then(data => console.log(data)); // выводит "данные" 🚩Ключевое слово await Используется для ожидания результата промиса внутри асинхронной функции async. Оно приостанавливает выполнение асинхронной функции до тех пор, пока промис не выполнится (т.е. не будет разрешен или отклонен). ЕЕ можно использовать только внутри асинхронных функций. async function fetchData() { let data = await fetch('https://api.example.com/data'); let json = await data.json(); return json; } 🚩Плюсы ➕Улучшение читаемости кода Асинхронный код, написанный с использованием async/await, выглядит более структурированным и похожим на синхронный код, что упрощает его понимание ➕Упрощение обработки ошибок В асинхронных функциях с await можно использовать стандартный синтаксис try/catch для обработки ошибок, что делает код единообразнее. ➕Избегание "callback hell" Использование async/await позволяет избежать сложностей с вложенными коллбэками, которые могут возникнуть при использовании промисов или старого стиля асинхронного кода с коллбэками. Ставь 👍 и забирай 📚 Базу знаний
🤔 Чем em отличается от rem? 🟠Как работает `em`? em зависит от размера шрифта родителя (font-size). .parent { font-size: 20px; } .child { font-size: 1.5em; /* 1.5 * 20px = 30px */ } Но если .child вложен в .parent, то он наследует font-size, а его em вычисляется относительно родителя. .parent { font-size: 20px; } .child { font-size: 1.5em; /* 30px */ } .grandchild { font-size: 2em; /* 2 * 30px = 60px */ } 🟠Как работает `rem`? rem всегда зависит от font-size у <html>. html { font-size: 16px; } .container { font-size: 2rem; /* 2 * 16px = 32px */ } 🟠Когда использовать `em`, а когда `rem`? Используйте rem, если нужно, чтобы шрифты и размеры были предсказуемыми Используйте em, если хотите, чтобы элементы зависели от родителя Ставь 👍 и забирай 📚 Базу знаний
🤔 Как бы повернул блок на 45 градусов? Чтобы повернуть блок на 45 градусов, используется свойство CSS transform с функцией rotate. Это свойство позволяет применять различные трансформации к элементам, включая вращение, масштабирование, смещение и наклон. 🚩Пример использования .rotated-box { width: 100px; height: 100px; background-color: lightblue; transform: rotate(45deg); } 🚩Объяснение Основной синтаксис 🟠Угол поворота элемента. Может быть положительным или отрицательным значением в градусах (deg), радианах (rad), градусах (grad) или оборотах (turn). transform: rotate(угол); 🟠Параметры Угол поворота элемента. В данном случае элемент поворачивается на 45 градусов по часовой стрелке. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .rotated-box { width: 100px; height: 100px; background-color: lightblue; transform: rotate(45deg); } </style> </head> <body> <div class="rotated-box"></div> </body> </html> 🚩Пояснение 🟠Свойство `transform` Позволяет применять различные визуальные эффекты к элементу, такие как вращение, масштабирование и смещение. 🟠Функция rotate Используется для вращения элемента на заданный угол. Положительные значения поворачивают элемент по часовой стрелке, отрицательные — против часовой стрелки. 🚩Использование в реальных проектах 🟠Вращение элементов Вращение элементов может использоваться для создания интересных визуальных эффектов, таких как поворот иконок, изображений или блоков текста. 🟠Анимация В комбинации с анимацией (@keyframes и transition), вращение может создавать динамичные и интерактивные пользовательские интерфейсы. Ставь 👍 и забирай 📚 Базу знаний
🤔 Основные причины отказа от классовых компонентов в react? С появлением React Hooks в версии 16.8 (2019 год) классовые компоненты стали устаревшим способом создания компонентов. Сегодня функциональные компоненты с хуками заменяют классы. Давайте разберем почему. 🟠Меньше кода → чище и понятнее Функциональные компоненты короче, читаются легче, а код становится чище. class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } increment = () => { this.setState({ count: this.state.count + 1 }); }; render() { return ( <button onClick={this.increment}> Счетчик: {this.state.count} </button> ); } } Функциональный компонент (хуки делают код проще) function Counter() { const [count, setCount] = useState(0); return ( <button onClick={() => setCount(count + 1)}> Счетчик: {count} </button> ); } 🟠Легче управлять жизненным циклом (useEffect vs componentDidMount) В классах жизненный цикл* компонента состоит из нескольких методов (componentDidMount, componentDidUpdate, componentWillUnmount). class Timer extends React.Component { constructor(props) { super(props); this.state = { time: 0 }; } componentDidMount() { this.timer = setInterval(() => { this.setState({ time: this.state.time + 1 }); }, 1000); } componentWillUnmount() { clearInterval(this.timer); } render() { return <p>Время: {this.state.time} секунд</p>; } } Функциональный компонент (хуки делают все проще) function Timer() { const [time, setTime] = useState(0); useEffect(() => { const timer = setInterval(() => setTime(t => t + 1), 1000); return () => clearInterval(timer); }, []); return <p>Время: {time} секунд</p>; } 🟠Лучшая производительность (меньше потребления памяти) Классовые компоненты используют экземпляры классов, а функциональные компоненты – просто функции. Создают экземпляры this Обрабатывают setState Хранят лишние связи и контексты Не создают this Используют только нужные данные Оптимизируются через React.memo const Button = React.memo(({ onClick }) => { console.log("Ререндер кнопки"); return <button onClick={onClick}>Нажми</button>; }); function App() { const [count, setCount] = useState(0); const increment = useCallback(() => setCount(c => c + 1), []); return ( <div> <p>Счетчик: {count}</p> <Button onClick={increment} /> </div> ); } 🟠Легче переиспользовать логику (React Hooks vs HOC/Render Props) Раньше в классах код переиспользовали через HOC и Render Props, но это делало код сложным. function withLogging(WrappedComponent) { return class extends React.Component { componentDidMount() { console.log("Компонент монтирован"); } render() { return <WrappedComponent {...this.props} />; } }; } Хуки (useEffect) делают код чище function useLogger() { useEffect(() => console.log("Компонент монтирован"), []); } function MyComponent() { useLogger(); return <p>Привет, мир!</p>; } 🟠Функциональные компоненты – будущее React React официально рекомендует использовать функциональные компоненты Dan Abramov (разработчик React) Новые фичи React (Suspense, Server Components) создаются для функциональных компонентов Классы не работают в React Server Components Большинство современных библиотек (Redux Toolkit, React Query) рассчитаны на хуки Ставь 👍 и забирай 📚 Базу знаний
🤔 Как достигается изоляция при использовании бэм? БЭМ (Блок, Элемент, Модификатор) достигает изоляции стилей с помощью уникальных имен классов. Это помогает избежать конфликтов между стилями и делает код более предсказуемым. 🚩Как БЭМ предотвращает конфликты? 🟠Все стили зависят только от конкретного блока В БЭМ нет зависимостей от родительских элементов, поэтому стили блока не сломаются, если он окажется в другом месте. <div class="button">Кнопка</div> .button { background: blue; color: white; } Плохой пример без БЭМ .container .button { background: blue; } 🟠Элементы (`__`) зависят только от своего блока Стили элемента никогда не зависят от родителя — только от блока. <div class="card"> <h2 class="card__title">Заголовок</h2> <p class="card__text">Текст карточки</p> </div> .card__title { font-size: 20px; } .card__text { color: gray; } 🟠Модификаторы (`--`) изменяют только нужные стили Модификаторы позволяют изменять внешний вид без переписывания базовых стилей. <button class="button button--red">Кнопка</button> <button class="button button--blue">Кнопка</button> .button { padding: 10px; border-radius: 5px; } .button--red { background: red; } .button--blue { background: blue; } 🟠Имена классов уникальны, нет глобальных стилей В БЭМ не используется tag {} или id {} — только классы. Это предотвращает конфликты стилей. h1 { color: red; } БЭМ-версия .card__title { color: red; } Ставь 👍 и забирай 📚 Базу знаний
🤔 В чем отличие атрибутов от свойств в html тегах? Атрибуты — это то, что записано в HTML. Свойства — это то, что появляется в JavaScript-объекте element. Когда браузер загружает страницу, он парсит HTML и создает DOM-объекты, в которых атрибуты превращаются в свойства. Однако атрибуты и свойства не всегда совпадают! 🟠Атрибуты (`attributes`) Хранятся в HTML. Всегда являются строками. Их можно получить с помощью .getAttribute() и изменить через .setAttribute(). Они не меняются динамически при изменении свойства элемента в JS. <input id="myInput" type="text" value="Hello"> const input = document.getElementById("myInput"); console.log(input.getAttribute("value")); // "Hello" 🟠Свойства (`properties`) Хранятся в объекте элемента (HTMLElement). Имеют разные типы данных (строки, числа, булевые и т. д.). Меняются динамически при взаимодействии с DOM. console.log(input.value); // "Hello" input.value = "New text"; // Меняем свойство console.log(input.getAttribute("value")); // "Hello" (атрибут НЕ поменялся) console.log(input.value); // "New text" (свойство изменилось) Пример с checked у чекбокса <input type="checkbox" id="myCheckbox" checked> const checkbox = document.getElementById("myCheckbox"); console.log(checkbox.getAttribute("checked")); // "checked" (атрибут есть, значит включен) console.log(checkbox.checked); // true (свойство JS - boolean) checkbox.checked = false; // Меняем состояние чекбокса console.log(checkbox.getAttribute("checked")); // "checked" (атрибут не поменялся!) console.log(checkbox.checked); // false (свойство изменилось) 🟠Как правильно работать с атрибутами и свойствами? Если хотите работать с DOM → используйте свойства (element.value, element.checked и т. д.). Если хотите работать с атрибутами в HTML → используйте .getAttribute() и .setAttribute(). const img = document.querySelector("img"); // Меняем атрибут src img.setAttribute("src", "new-image.jpg"); // Меняем свойство width img.width = 300; Ставь 👍 и забирай 📚 Базу знаний
🔥 Скрытые вакансии с удаленной работой для Frontend разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров. 🔹 Frontend Jobs | Вакансии 🔹 Node.js Jobs | Вакансии 🔸 Все каналы с вакансиями
🤔 Какие есть альтернативы у redux? Redux – мощный инструмент, но не всегда он необходим. Существует множество альтернатив, каждая из которых подходит для разных сценариев. 🚩React Context API + useReducer Подходит для небольших и средних приложений Встроено в React (не требует установки дополнительных библиотек) useContext` позволяет передавать данные по дереву компонентов без "прокидывания" через props useReducer работает как Redux, но проще const AuthContext = createContext(); function authReducer(state, action) { switch (action.type) { case "LOGIN": return { ...state, isAuthenticated: true, user: action.payload }; case "LOGOUT": return { ...state, isAuthenticated: false, user: null }; default: return state; } } function AuthProvider({ children }) { const [state, dispatch] = useReducer(authReducer, { isAuthenticated: false, user: null, }); return ( <AuthContext.Provider value={{ state, dispatch }}> {children} </AuthContext.Provider> ); } function LoginButton() { const { dispatch } = useContext(AuthContext); return ( <button onClick={() => dispatch({ type: "LOGIN", payload: "Иван" })}> Войти </button> ); } 🚩Zustand Проще Redux, но с теми же возможностями Нет лишних actions и reducers, только функции import { create } from "zustand"; const useStore = create((set) => ({ count: 0, increment: () => set((state) => ({ count: state.count + 1 })), })); function Counter() { const { count, increment } = useStore(); return <button onClick={increment}>Счетчик: {count}</button>; } 🚩Recoil Идеален для React-приложений Гибче, чем Redux, с концепцией "атомов" (раздельные состояния) import { atom, useRecoilState } from "recoil"; const countState = atom({ key: "count", default: 0, }); function Counter() { const [count, setCount] = useRecoilState(countState); return <button onClick={() => setCount(count + 1)}>Счетчик: {count}</button>; } 🚩Jotai Напоминает Recoil, но без сложных концепций Поддерживает React Suspense и асинхронные состояния import { atom, useAtom } from "jotai"; const countAtom = atom(0); function Counter() { const [count, setCount] = useAtom(countAtom); return <button onClick={() => setCount(count + 1)}>Счетчик: {count}</button>; } 🚩MobX Автоматически отслеживает изменения состояния Удобен для сложных приложений import { makeAutoObservable } from "mobx"; import { observer } from "mobx-react-lite"; class CounterStore { count = 0; constructor() { makeAutoObservable(this); } increment() { this.count++; } } const store = new CounterStore(); const Counter = observer(() => ( <button onClick={() => store.increment()}>Счетчик: {store.count}</button> )); 🚩XState Подходит для сложных логик (например, UI-анимаций, состояний формы) Удобно описывать последовательности действий import { createMachine, interpret } from "xstate"; const toggleMachine = createMachine({ id: "toggle", initial: "inactive", states: { inactive: { on: { TOGGLE: "active" } }, active: { on: { TOGGLE: "inactive" } }, }, }); const service = interpret(toggleMachine).start(); service.send("TOGGLE"); // Меняет состояние Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое делегирование? Делегирование событий (Event Delegation) — это техника, при которой мы не навешиваем обработчик на каждый элемент, а ставим один обработчик на родителя и отслеживаем события его потомков. 🚩Как работает делегирование? Обычный способ (без делегирования) Если у нас есть 10 кнопок, мы можем повесить обработчик на каждую document.querySelectorAll("button").forEach((btn) => { btn.addEventListener("click", () => { console.log("Кнопка нажата"); }); }); Если кнопок 1000, это создаст 1000 обработчиков, что неэффективно. Если кнопки добавляются динамически (например, из API), обработчик на новые кнопки не сработает. 🟠Делегирование событий (оптимальный способ) Вместо того чтобы вешать обработчик на каждую кнопку, ставим один обработчик на родительский элемент и проверяем, кто вызвал событие: document.getElementById("container").addEventListener("click", (event) => { if (event.target.tagName === "BUTTON") { console.log("Кнопка нажата:", event.target.textContent); } }); 🟠Пример с динамическими элементами Если мы добавляем кнопки динамически, обработчик все равно будет работать document.getElementById("container").addEventListener("click", (event) => { if (event.target.classList.contains("btn")) { console.log("Нажата кнопка:", event.target.textContent); } }); // Добавляем новую кнопку динамически setTimeout(() => { const newButton = document.createElement("button"); newButton.classList.add("btn"); newButton.textContent = "Новая кнопка"; document.getElementById("container").appendChild(newButton); }, 2000); Ставь 👍 и забирай 📚 Базу знаний
🤔 Откуда взялся CSS? CSS (Cascading Style Sheets) появился в 1996 году для отделения стилей от структуры HTML. Разработан Хоконом Виум Ли для упрощения управления дизайном веб-страниц и обеспечения каскадности стилей. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
🤔 Какие значения будут являться falsy значениями? В JavaScript значения, которые при приведении к логическому типу (boolean) становятся false, называются "falsy" значениями. Существует всего семь таких значений: 🟠`false` Логическое значение false. console.log(Boolean(false)); // false 🟠`0` Число ноль. console.log(Boolean(0)); // false 🟠`-0` Отрицательное число ноль (хотя это редко встречается на практике). console.log(Boolean(-0)); // false 🟠`0n` Число BigInt с значением ноль. console.log(Boolean(0n)); // false 🟠`""` (пустая строка) Строка без символов. console.log(Boolean("")); // false 🟠`null` Специальное значение, обозначающее отсутствие какого-либо значения. console.log(Boolean(null)); // false 🟠`undefined` Специальное значение, обозначающее необъявленное или неприсвоенное значение. console.log(Boolean(undefined)); // false 🟠`NaN` Специальное значение, обозначающее не число (Not-a-Number). console.log(Boolean(NaN)); // false 🚩Примеры использования 🟠Проверка значений на falsy В условиях (if statements) все falsy значения интерпретируются как false. const values = [false, 0, -0, 0n, "", null, undefined, NaN]; values.forEach(value => { if (!value) { console.log(`${value} is falsy`); } }); Примеры в условиях if (!false) { console.log('false is falsy'); // выводится } if (!0) { console.log('0 is falsy'); // выводится } if (!"") { console.log('"" is falsy'); // выводится } if (!null) { console.log('null is falsy'); // выводится } if (!undefined) { console.log('undefined is falsy'); // выводится } if (!NaN) { console.log('NaN is falsy'); // выводится } 🟠Использование в логических операторах Falsy значения также учитываются в логических операциях. const value = null; const result = value || 'default value'; console.log(result); // 'default value', потому что value является falsy Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое meta теги? Meta-теги – это специальные HTML-теги, которые содержат метаинформацию о веб-странице. Они располагаются внутри <head> и не отображаются на самой странице, но помогают браузерам, поисковым системам и социальным сетям правильно обрабатывать и отображать страницу. 🚩Зачем нужны meta-теги? Улучшают SEO (поисковую оптимизацию) Управляют отображением в соцсетях и поисковиках Настраивают адаптивность страницы (например, на мобильных устройствах) Определяют кодировку, язык и авторство страницы 🚩Основные meta-теги с примерами Кодировка страницы <meta charset="UTF-8"> Описание страницы (SEO) <meta name="description" content="Лучший сайт с рецептами вкусных блюд!"> Ключевые слова (SEO, устарело) <meta name="keywords" content="рецепты, еда, кулинария, блюда"> Автор страницы <meta name="author" content="Иван Иванов"> Запрет индексации страницы <meta name="robots" content="noindex, nofollow"> Адаптивность на мобильных устройствах <meta name="viewport" content="width=device-width, initial-scale=1.0"> Социальные сети (Open Graph, Twitter Cards) Facebook и другие соцсети (Open Graph) <meta property="og:title" content="Вкусные рецепты"> <meta property="og:description" content="Попробуйте лучшие блюда со всего мира!"> <meta property="og:image" content="https://example.com/image.jpg"> <meta property="og:url" content="https://example.com"> Twitter-карточки <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Рецепты для гурманов"> <meta name="twitter:image" content="https://example.com/image.jpg"> Ставь 👍 и забирай 📚 Базу знаний
Комментарии
Комментариев пока нет
Комментарии пишут вошедшие — так видно, кто автор.
Войти