Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads
Post #380
6.19K
- 👍 12
FR @easy_javascript_ru
Showing posts older than #382 · Back to latest
const result = 'The answer is ' + 42;
console.log(result); // 'The answer is 42'
const result = '42' - 10;
console.log(result); // 32
if) значения автоматически приводятся к логическому типу (true или false). if ('hello') {
console.log('This is true'); // This is true
}
if (0) {
console.log('This is false'); // This will not be executed
}
String() или оператор + с пустой строкой.const num = 42;
const str1 = String(num);
const str2 = num + '';
console.log(str1); // '42'
console.log(str2); // '42'
Number(), parseInt(), или parseFloat().const str = '42';
const num1 = Number(str);
const num2 = parseInt(str, 10);
const num3 = parseFloat(str);
console.log(num1); // 42
console.log(num2); // 42
console.log(num3); // 42
Boolean() или двойное отрицание !!.const value = 0;
const bool1 = Boolean(value);
const bool2 = !!value;
console.log(bool1); // false
console.log(bool2); // false
undefined | 'undefined' | NaN | false |null | 'null' | 0 | false |true | 'true' | 1 | true |false | 'false' | 0 | false |42 | '42' | 42 | true |0 | '0' | 0 | false |'' (пустая строка) | '' | 0 | false |'42' | '42' | 42 | true |'hello' | 'hello' | NaN | true |{} (пустой объект) | '[object Object]' | NaN | true |[] (пустой массив) | '' | 0 | true |[42] | '42' | 42 | true |[1, 2, 3] | '1,2,3' | NaN | true |Forwarded from Идущий к IT

div, h1, p, ::before, ::after): вес 1..class, [type="text"], :hover, :nth-child): вес 10.#id): вес 100.style): вес 1000.!important): не учитывают специфичность, а просто переопределяют другие правила.a — количество инлайновых стилей (1 или 0).b — количество идентификаторов.c — количество классов, атрибутов и псевдоклассов.d — количество элементов и псевдоэлементов. div { color: red; } /* Специфичность: 0, 0, 0, 1 */
p::before { content: ''; } /* Специфичность: 0, 0, 0, 2 */
.example { color: blue; } /* Специфичность: 0, 0, 1, 0 */
[type="text"] { color: green; } /* Специфичность: 0, 0, 1, 0 */
:hover { color: yellow; } /* Специфичность: 0, 0, 1, 0 */
#unique { color: orange; } /* Специфичность: 0, 1, 0, 0 */
<div style="color: purple;"></div> <!-- Специфичность: 1, 0, 0, 0 -->
#unique .example:hover { color: pink; } /* Специфичность: 0, 1, 1, 1 */
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Specificity Example</title>
<style>
p { color: red; } /* Специфичность: 0, 0, 0, 1 */
.text { color: green; } /* Специфичность: 0, 0, 1, 0 */
#unique { color: blue; } /* Специфичность: 0, 1, 0, 0 */
.text#unique { color: orange; } /* Специфичность: 0, 1, 1, 0 */
</style>
</head>
<body>
<p class="text" id="unique">This is a paragraph.</p>
</body>
</html>
.text#unique имеет наибольшую специфичность (0, 1, 1, 0).!important может затруднить управление стилями и отладку.p { color: red !important; } /* Перебивает все другие правила */Promise.all возвращает новый промис, который:Promise.all(iterable);
const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 'Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // ['First', 'Second', 'Third']
})
.catch((error) => {
console.error('One of the promises failed:', error);
});
Promise.all отклоняет весь результат.const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'Error in Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // This line will not be executed
})
.catch((error) => {
console.error('One of the promises failed:', error); // 'Error in Second'
});
Promise.all также можно использовать с async/await для более удобной работы с асинхронным кодом.const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 'Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
async function runPromises() {
try {
const results = await Promise.all([promise1, promise2, promise3]);
console.log(results); // ['First', 'Second', 'Third']
} catch (error) {
console.error('One of the promises failed:', error);
}
}
runPromises();
Promise.all используется для выполнения нескольких асинхронных операций параллельно и возвращает один промис, который разрешается массивом результатов, если все промисы выполнены успешно, или отклоняется, если любой из промисов отклоняется. Это полезно для управления несколькими асинхронными задачами одновременно.import React, { useEffect, useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('useEffect: Выполняется после рендеринга');
document.title = `Вы нажали ${count} раз`;
return () => {
console.log('useEffect: Очистка');
};
}, [count]);
return (
<div>
<p>Вы нажали {count} раз</p>
<button onClick={() => setCount(count + 1)}>Нажми меня</button>
</div>
);
}
export default Example;useLayoutEffect, будут видны пользователю до того, как браузер нарисует обновленный интерфейс.import React, { useLayoutEffect, useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
useLayoutEffect(() => {
console.log('useLayoutEffect: Выполняется после рендеринга, но перед отрисовкой');
document.title =раз</p>
<button onCl
return () => {
console.log('useLayoutEffect: Очистка');
};
}, [count]);
return (
<div>
<p>Вы нажали {count} раз</p>
<button onClick={() => setCount(count + 1)}>Нажми меня</button>
</div>
);
}
export default Example;useEffect выполняется асинхронно после того, как браузер обновил экран.useLayoutEffect выполняется синхронно перед тем, как браузер обновит экран.useEffect лучше подходит для побочных эффектов, которые не влияют на компоновку и отрисовку интерфейса.useLayoutEffect лучше подходит для побочных эффектов, которые должны быть выполнены перед отрисовкой, таких как измерение или изменения в DOM. Map от объектов, где ключи могут быть только строками или символами.const map = new Map();
map.set('a', 1);
map.set(1, 'one');
map.set({}, 'object');
map.set(function() {}, 'function');
console.log(map);
map.keys(), map.values(), и map.entries(), что упрощает работу с коллекцией данных.set(key, value): Добавляет новую пару ключ-значение в Map.get(key): Возвращает значение, соответствующее ключу.has(key): Возвращает true, если ключ присутствует в Map.delete(key): Удаляет пару ключ-значение по ключу.clear(): Очищает Map.size: Возвращает количество элементов в Map.const map = new Map();
map.set('name', 'Alice');
map.set('age', 25);
console.log(map.get('name')); // Alice
console.log(map.has('age')); // true
console.log(map.size); // 2
for (const [key, value] of map) {
console.log(key, value);
}
// name Alice
// age 25
Set каждое значение может присутствовать только один раз.Set автоматически удаляет дубликаты значений, что позволяет легко создавать коллекции уникальных элементов.Set поддерживает итерацию и имеет встроенные методы для работы с коллекцией данных.add(value): Добавляет новое значение в Set.has(value): Возвращает true, если значение присутствует в Set.delete(value): Удаляет значение из Set.clear(): Очищает Set.size: Возвращает количество элементов в Set.const set = new Set();
set.add(1);
set.add(2);
set.add(2); // Дубликат не добавится
set.add(3);
console.log(set.has(2)); // true
console.log(set.size); // 3
for (const value of set) {
console.log(value);
}
// 1
// 2
// 3
Map предоставляет более гибкую работу с парами ключ-значение, поддерживая любые типы данных в качестве ключей и сохраняя порядок вставки.Set предоставляет коллекцию уникальных значений и автоматически удаляет дубликаты.let age: number = 25;
let name: string = "Alice";
function greet(name: string): string {
return `Hello, ${name}`;
}
class Person {
private name: string;
constructor(name: string) {
this.name = name;
}
public greet(): void {
console.log(`Hello, my name is ${this.name}`);
}
}
const alice = new Person("Alice");
alice.greet(); // Hello, my name is Alice
interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 1,
name: "Alice",
email: "alice@example.com"
};
// TypeScript
let message: string = "Hello, TypeScript";
// Компилированный JavaScript
var message = "Hello, TypeScript";
npm install -g typescript
tsc --init
tsconfig.json, в котором можно настроить параметры компиляции TypeScript.// src/index.ts
const greet = (name: string): string => {
return Hello, ${name};
};
console.log(greet("TypeScript"));
tsc
index.js в папке dist или другой указанной папке.node dist/index.js
Map более подходящим для определенных задач по сравнению с обычными объектами. Вот основные отличия: const obj = {};
obj[1] = 'one'; // Ключ преобразуется в строку '1'
console.log(obj['1']); // 'one'
const a = { key: 'a' };
const b = { key: 'b' };
obj[a] = 'value'; // Ключ преобразуется в '[object Object]'
console.log(obj['[object Object]']); // 'value'
const map = new Map();
map.set(1, 'one');
console.log(map.get(1)); // 'one'
const a = { key: 'a' };
const b = { key: 'b' };
map.set(a, 'valueA');
map.set(b, 'valueB');
console.log(map.get(a)); // 'valueA'
console.log(map.get(b)); // 'valueB'
for...in или методов Object.keys(), Object.values() и Object.entries(). const obj = { a: 1, b: 2 };
for (const key in obj) {
console.log(key, obj[key]);
}
Object.keys(obj).forEach(key => console.log(key, obj[key]));
map.keys(), map.values() и map.entries(). Эти методы возвращают итерируемые объекты.const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {
console.log(key, value);
}
map.forEach((value, key) => console.log(key, value));
Map оптимизирован для частого добавления и удаления ключей и значений.set, get, has, delete, и свойства, такие как size.const map = new Map();
map.set('key', 'value');
console.log(map.has('key')); // true
console.log(map.get('key')); // 'value'
map.delete('key');
console.log(map.size); // 0
const obj = { a: 1 };
console.log(obj.toString); // [Function: toString] - свойство унаследовано от Object.prototype
Map нет такой проблемы, так как он не использует цепочку прототипов для хранения данных.const map = new Map();
map.set('a', 1);
console.log(map.toString); // [Function: toString] - метод самого Map, а не его данных
Promise.all принимает массив промисов и выполняет их параллельно. Он завершится успешно, когда все промисы в массиве будут выполнены.Promise.all сразу отклоняет весь промис, не дожидаясь выполнения остальных.Promise.all(iterable);
const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 'Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // ['First', 'Second', 'Third']
})
.catch((error) => {
console.error('One of the promises failed:', error);
});
Promise.all отклоняет весь результат.const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'Error in Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // This line will not be executed
})
.catch((error) => {
console.error('One of the promises failed:', error); // 'Error in Second'
});
Promise.all также можно использовать с async/await для более удобной работы с асинхронным кодом.const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 'Second'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, 'Third'));
async function runPromises() {
try {
const results = await Promise.all([promise1, promise2, promise3]);
console.log(results); // ['First', 'Second', 'Third']
} catch (error) {
console.error('One of the promises failed:', error);
}
}
runPromises();
Promise.all принимает массив промисов и возвращает один промис, который выполняется, когда все промисы в массиве выполнены успешно, или отклоняется, если любой из промисов отклонен. Он позволяет обрабатывать несколько асинхронных операций параллельно и возвращает массив результатов всех промисов.false. Эти значения часто используются в условиях (например, в if выражениях) для проверки истинности или ложности.false является ложным. if (false) {
console.log('Это не выполнится');
}
if (0) {
console.log('Это не выполнится');
}if (-0) {
console.log('Это тоже не выполнится');
}if ("") {
console.log('Это не выполнится');
}if (null) {
console.log('Это не выполнится');
}if (undefined) {
console.log('Это не выполнится');
}if (NaN) {
console.log('Это не выполнится');
}const value = 0;
if (!value) {
console.log('value является falsy'); // Это выполнится
}
const value = null;
const result = value || 'Значение по умолчанию';
console.log(result); // 'Значение по умолчанию'
function greet(name) {
name = name || 'гость';
console.log('Привет, ' + name);
}
greet(); // Привет, гость
greet('Алиса'); // Привет, АлисаDocumentFragment, а затем добавьте фрагмент в DOM одним действием.const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const div = document.createElement('div');
div.textContent = `Item ${i}`;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
✅Batch DOM updates:
element.style.width = '100px';
element.style.height = '100px';
element.style.backgroundColor = 'red';
.new-style {
width: 100px;
height: 100px;
background-color: red;
}
offsetHeight или offsetWidth, после изменения стилей, заставляет браузер выполнять немедленную перерисовку. Избегайте таких действий. .animated {
transition: transform 0.3s;
transform: translateX(100px);
}
resize или scroll), чтобы уменьшить количество вызовов обработчиков событий. function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
window.addEventListener('resize', debounce(() => {
console.log('Resized!');
}, 200));
const height = element.offsetHeight;
element.style.height =out;
return func
const height = element.offsetHeight;
element.style.height = ${height + 10}px;
.will-change-transform {
will-change: transform;
}document.querySelector('form').addEventListener('submit', function(event) {
event.preventDefault();
console.log('Форма не отправлена!');
});document.querySelector('a').addEventListener('click', function(event) {
event.preventDefault();
console.log('Переход по ссылке отменен!');
});document.querySelector('.child').addEventListener('click', function(event) {
event.stopPropagation();
console.log('Клик на child');
});
document.querySelector('.parent').addEventListener('click', function() {
console.log('Клик на parent');
});.child элемент не вызовет обработчик клика на .parent элементе.HttpOnly помогает защитить куки от доступа через JavaScript, а флаг Secure гарантирует их передачу только по HTTPS.document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/";
const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
app.get('/', (req, res) => {
if (req.session.views) {
req.session.views++;
res.send(`Number of views: ${req.session.views}`);
} else {
req.session.views = 1;
res.send('Welcome to the session demo. Refresh!');
}
});
app.listen(3000);