Миксины в препроцессорах CSS, таких как Sass, LESS и Stylus, представляют собой переиспользуемые блоки кода, которые можно вставлять в другие блоки стилей. Они позволяют группировать наборы стилей, которые можно повторно использовать по всему CSS-файлу. Это помогает уменьшить дублирование кода и упростить его поддержку.
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
}
.box {
@include border-radius(10px);
}
.button {
@include border-radius(5px);
}
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.box {
.border-radius(10px);
}
.button {
.border-radius(5px);
}
border-radius(radius)
-webkit-border-radius: radius
-moz-border-radius: radius
border-radius: radius
.box
border-radius(10px)
.button
border-radius(5px
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25
Простые: селекторы тегов (div), классов (.class), ID (
Комбинаторы: потомок (A B), прямой потомок (A > B), сосед (A + B), все последующие (A ~ B).
Псевдоклассы: :hover, :nth-child(n), :first-of-type.
Псевдоэлементы: ::before, ::after, ::placeholder.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39🔥7🤯1
Это популярный фреймворк для разработки интерфейсов веб-приложений. Он включает в себя набор инструментов для создания адаптивных и удобных для пользователя веб-страниц. Bootstrap предоставляет готовые CSS и JavaScript компоненты.
Bootstrap использует гибкую сеточную систему, основанную на 12 колонках, что позволяет создавать адаптивные макеты. Вы можете легко управлять расположением элементов на странице для различных размеров экранов.
<div class="container">
<div class="row">
<div class="col-md-4">Колонка 1</div>
<div class="col-md-4">Колонка 2</div>
<div class="col-md-4">Колонка 3</div>
</div>
</div>
Bootstrap включает множество готовых компонентов, таких как кнопки, формы, карточки, навигационные панели, модальные окна и многое другое. Эти компоненты можно легко стилизовать и настроить.
<button type="button" class="btn btn-primary">Основная кнопка</button>
В Bootstrap также включены JavaScript плагины, которые добавляют интерактивность и динамичность. Например, модальные окна, карусели, выпадающие меню и другие.
<!-- Кнопка для вызова модального окна -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
Запустить модальное окно
</button>
<!-- Модальное окно -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Название модального окна</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
Содержимое модального окна.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Закрыть</button>
<button type="button" class="btn btn-primary">Сохранить изменения</button>
</div>
</div>
</div>
</div>
В Bootstrap имеются утилиты для быстрого добавления часто используемых стилей, таких как отступы, цвета, выравнивание текста и другие. Эти утилиты позволяют быстро применять стили без написания дополнительных CSS-классов.
<div class="p-3 mb-2 bg-primary text-white">Основной фон с отступами и белым текстом</div>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥10
Методы
map
, filter
, reduce
и forEach
в JavaScript предназначены для обработки массивов и предоставляют мощные инструменты для работы с данными. Эти методы упрощают и делают код более читаемым и декларативным.Метод
forEach
выполняет указанную функцию один раз для каждого элемента в массиве.const array = [1, 2, 3, 4, 5];
array.forEach((element) => {
console.log(element);
});
forEach
просто выполняет функцию для каждого элемента и не возвращает новый массив или значение.Подходит для выполнения побочных эффектов, таких как логирование или изменение элементов массива.
Метод
map
создаёт новый массив с результатом вызова указанной функции для каждого элемента массива.const array = [1, 2, 3, 4, 5];
const doubled = array.map((element) => {
return element * 2;
});
console.log(doubled); // [2, 4, 6, 8, 10]
Каждый элемент нового массива является результатом вызова функции.
Подходит для преобразования данных, не изменяя исходный массив.
Метод
filter
создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.const array = [1, 2, 3, 4, 5];
const evenNumbers = array.filter((element) => {
return element % 2 === 0;
});
console.log(evenNumbers); // [2, 4]
Включает только те элементы, которые соответствуют условию.
Подходит для фильтрации данных на основе заданного условия.
Метод
reduce
выполняет функцию редуктора (сборщика) для каждого элемента массива, сводя массив к одному значению.const array = [1, 2, 3, 4, 5];
const sum = array.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
}, 0);
console.log(sum); // 15
Результат выполнения функции редуктора.
Второй аргумент функции
reduce
задает начальное значение аккумулятора.Подходит для агрегирования данных, например, для вычисления суммы, произведения или объединения значений.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥1
Были введены в ECMAScript 2015 (ES6) и представляют собой улучшение стандартных строк в JavaScript. Они облегчают работу с строками, предоставляя более удобный синтаксис для создания многострочных строк, интерполяции переменных и встроенных выражений.
Шаблонные литералы позволяют встраивать переменные и выражения внутрь строк с помощью синтаксиса
${}
.const name = 'Alice';
const age = 25;
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting);
// Вывод: Hello, my name is Alice and I am 25 years old.
Шаблонные литералы позволяют создавать многострочные строки без необходимости использования символов переноса строки (
\n
).const multiLineString = `This is a string
that spans across
multiple lines.`;
console.log(multiLineString);
// Вывод:
// This is a string
// that spans across
// multiple lines.
Внутри шаблонных литералов можно использовать любые JavaScript-выражения.
const a = 5;
const b = 10;
const result = `The sum of ${a} and ${b} is ${a + b}.`;
console.log(result);
// Вывод: The sum of 5 and 10 is 15.
Можно вызывать функции и методы внутри шаблонных литералов.
function toUpperCase(str) {
return str.toUpperCase();
}
const name = 'Alice';
const loudGreeting = `Hello, ${toUpperCase(name)}!`;
console.log(loudGreeting);
// Вывод: Hello, ALICE!
Тегированные шаблонные литералы позволяют обработать строку с помощью функции перед ее окончательной интерпретацией.
function tag(strings, ...values) {
console.log(strings);
console.log(values);
return 'Tagged template';
}
const name = 'Alice';
const age = 25;
const taggedResult = tag`Name: ${name}, Age: ${age}`;
console.log(taggedResult);
// Вывод:
// [ 'Name: ', ', Age: ', '' ]
// [ 'Alice', 25 ]
// Tagged template
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥4❤3
Google разработал набор метрик, называемых Web Vitals, которые оценивают ключевые аспекты пользовательского опыта:
Largest Contentful Paint (LCP): Время загрузки основного контента страницы.
First Input Delay (FID): Время от первого взаимодействия пользователя с сайтом до момента, когда браузер начинает обработку этого взаимодействия.
Cumulative Layout Shift (CLS): Стабильность макета страницы (измеряет неожиданные сдвиги контента).
Google Lighthouse: Инструмент, встроенный в Chrome DevTools, который анализирует страницу и предлагает улучшения.
PageSpeed Insights: Онлайн-сервис от Google, который предоставляет отчеты о производительности сайта на мобильных и десктопных устройствах.
WebPageTest: Позволяет проводить детализированные тесты производительности с разными настройками сети и устройства.
Chrome DevTools: Включает вкладку "Performance" для записи и анализа производительности загрузки страницы и исполнения скриптов.
Network Panel: Показывает время загрузки различных ресурсов, что помогает найти "узкие места".
Google Analytics: Предоставляет отчеты о скорости загрузки страниц.
New Relic, Datadog: Платформы для мониторинга производительности приложений и сайтов в реальном времени.
Использование CDN (Content Delivery Network): Ускоряет доставку контента пользователям, снижая задержки.
Минимизация и сжатие ресурсов: Уменьшение размеров файлов CSS, JavaScript и изображений.
Кэширование: Хранение копий статических ресурсов для ускорения повторных посещений.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥3🤯2💊1
Оператор
in
проверяет, существует ли указанное свойство в объекте или его прототипе.const obj = {
name: 'Alice',
age: 25
};
console.log('name' in obj); // true
console.log('age' in obj); // true
console.log('gender' in obj); // false
Метод
hasOwnProperty
проверяет, существует ли указанное свойство непосредственно в объекте (не в его прототипе).const obj = {
name: 'Alice',
age: 25
};
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('age')); // true
console.log(obj.hasOwnProperty('gender')); // false
Вы также можете проверить, является ли значение свойства
undefined
. Однако этот метод не отличает отсутствие свойства от свойства, имеющего значение undefined
.const obj = {
name: 'Alice',
age: 25,
gender: undefined
};
console.log(obj.name !== undefined); // true
console.log(obj.age !== undefined); // true
console.log(obj.gender !== undefined); // false, хотя свойство есть, его значение undefined
console.log(obj.height !== undefined); // false, так как свойство отсутствует
Если свойство находится в цепочке прототипов, оператор
in
вернет true
.const parentObj = {
inheritedProperty: 'I am inherited'
};
const childObj = Object.create(parentObj);
childObj.ownProperty = 'I am own property';
console.log('inheritedProperty' in childObj); // true
console.log('ownProperty' in childObj); // true
console.log(childObj.hasOwnProperty('inheritedProperty')); // false
console.log(childObj.hasOwnProperty('ownProperty')); // true
Для проверки наличия вложенных свойств можно использовать цепочку проверок или библиотеку, такую как Lodash, которая предоставляет функцию
_.has
.const nestedObj = {
user: {
name: 'Alice',
address: {
city: 'Wonderland'
}
}
};
console.log('user' in nestedObj && 'name' in nestedObj.user); // true
console.log('user' in nestedObj && 'age' in nestedObj.user); // false
console.log('user' in nestedObj && 'address' in nestedObj.user && 'city' in nestedObj.user.address); // true
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🔥2❤1💊1
Самый простой и распространенный способ создания объекта.
const obj = {
name: 'Alice',
age: 25
};
Создание объекта с помощью конструктора
Object
.const obj = new Object();
obj.name = 'Alice';
obj.age = 25;
Использование функции-конструктора для создания объектов.
function Person(name, age) {
this.name = name;
this.age = age;
}
const alice = new Person('Alice', 25);
const bob = new Person('Bob', 30);
Создание нового объекта с указанным прототипом.
const proto = {
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const obj = Object.create(proto);
obj.name = 'Alice';
obj.age = 25;
obj.greet(); // Hello, my name is Alice
Использование классов (синтаксический сахар над функцией-конструктором).
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
const alice = new Person('Alice', 25);
const bob = new Person('Bob', 30);
alice.greet(); // Hello, my name is Alice
bob.greet(); // Hello, my name is Bob
Использование функции для создания и возврата объектов.
function createPerson(name, age) {
return {
name: name,
age: age,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
}
const alice = createPerson('Alice', 25);
const bob = createPerson('Bob', 30);
alice.greet(); // Hello, my name is Alice
bob.greet(); // Hello, my name is Bob
Создание объекта из JSON-строки.
const jsonString = '{"name": "Alice", "age": 25}';
const obj = JSON.parse(jsonString);
console.log(obj.name); // Alice
console.log(obj.age); // 25
Создание копий объектов или объединение объектов.
const obj1 = { name: 'Alice' };
const obj2 = { age: 25 };
const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); // { name: 'Alice', age: 25 }
const copiedObj = { ...obj1 };
console.log(copiedObj); // { name: 'Alice' }
Использование функций для динамического создания объектов.
function createPerson(name, age) {
return {
name,
age,
greet() {
console.log(`Hello, my name is ${this.name}`);
}
};
}
const alice = createPerson('Alice', 25);
alice.greet(); // Hello, my name is Alice
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🔥3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍15
В JavaScript значения, которые при приведении к логическому типу (boolean) становятся
false
, называются "falsy" значениями. Существует всего семь таких значений:Логическое значение
false
. console.log(Boolean(false)); // false
Число ноль.
console.log(Boolean(0)); // false
Отрицательное число ноль (хотя это редко встречается на практике).
console.log(Boolean(-0)); // false
Число
BigInt
с значением ноль. console.log(Boolean(0n)); // false
Строка без символов.
console.log(Boolean("")); // false
Специальное значение, обозначающее отсутствие какого-либо значения.
console.log(Boolean(null)); // false
Специальное значение, обозначающее необъявленное или неприсвоенное значение.
console.log(Boolean(undefined)); // false
Специальное значение, обозначающее не число (Not-a-Number).
console.log(Boolean(NaN)); // false
В условиях (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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
- DOM позволяет программам читать и изменять документ структурно, стилистически и содержательно, реагируя на пользовательские взаимодействия.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥4❤1
async
и await
— это синтаксический сахар в JavaScript, предназначенный для упрощения работы с промисами и асинхронными операциями. Они позволяют писать асинхронный код, который выглядит как синхронный, улучшая его читаемость и удобство использования.Ключевое слово, которое используется перед функцией для обозначения её как асинхронной. Асинхронная функция всегда возвращает промис.
Ключевое слово, которое используется внутри асинхронной функции для ожидания выполнения промиса. Оно приостанавливает выполнение функции до тех пор, пока промис не будет выполнен.
Пример с
fetch
// Асинхронная функция для выполнения запроса и обработки данных
async function fetchData(url) {
try {
// Ожидание выполнения запроса
const response = await fetch(url);
// Проверка статуса ответа
if (!response.ok) {
throw new Error('Network response was not ok');
}
// Ожидание преобразования ответа в JSON
const data = await response.json();
// Работа с данными
console.log(data);
} catch (error) {
// Обработка ошибок
console.error('Fetch error:', error);
}
}
// Вызов асинхронной функции
fetchData('https://api.example.com/data');
async function fetchData(url) { ... }
await
для ожидания выполнения запросаconst response = await fetch(url);
try...catch
try {
...
} catch (error) {
...
}
const data = await response.json();
Код выглядит как синхронный, что упрощает его понимание и сопровождение.
Использование блоков
try...catch
делает обработку ошибок более явной и удобной.синхронные операции выполняются в логической последовательности, что упрощает написание сложных асинхронных цепочек.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥4❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤5🤯1
Чтобы избежать ссылочной зависимости при копировании объекта в JavaScript, необходимо создать глубокую копию объекта. Глубокая копия означает, что все вложенные объекты и массивы также будут скопированы, а не просто ссылки на них.
Этот метод подходит для простых объектов, не содержащих функций, специальных объектов (например,
Date
) или циклических ссылок.const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = JSON.parse(JSON.stringify(original));
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
Этот метод позволяет точно контролировать процесс копирования и обрабатывать более сложные структуры данных.
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (Array.isArray(obj)) {
const arrCopy = [];
obj.forEach((item, index) => {
arrCopy[index] = deepClone(item);
});
return arrCopy;
}
const objCopy = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
objCopy[key] = deepClone(obj[key]);
}
}
return objCopy;
}
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = deepClone(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
Lodash предоставляет удобную функцию
cloneDeep
для глубокого копирования объектов.const _ = require('lodash');
const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = _.cloneDeep(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
Метод
structuredClone
позволяет создавать глубокие копии объектов. Этот метод является частью HTML Living Standard и поддерживается в некоторых современных браузерах и средах исполнения.const original = {
name: 'Alice',
age: 25,
address: {
city: 'Wonderland',
zip: '12345'
}
};
const copy = structuredClone(original);
copy.address.city = 'Otherland';
console.log(original.address.city); // Wonderland
console.log(copy.address.city); // Otherland
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3