Frontend | Вопросы собесов
19.3K subscribers
34 photos
1 video
914 links
Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp

Тесты t.me/+T0COHtFzCJkwMDUy
Задачи t.me/+_tcX2w2EmvdmMTgy
Вакансии t.me/+CgCAzIyGHHg0Nzky
Download Telegram
С помощью чего скопировал бы объект ?
Спросят с вероятностью 7%

Есть несколько способов скопировать объект. Важно понимать разницу между поверхностным (shallow) и глубоким (deep) копированием. Поверхностная копия копирует только сам объект и его непосредственные свойства, в то время как глубокая копия копирует весь объект и все его вложенные объекты.

Поверхностное копирование

1️⃣Object.assign

Метод Object.assign копирует все перечисляемые свойства из одного или более исходных объектов в целевой объект.
const original = { a: 1, b: 2 };
const copy = Object.assign({}, original);
console.log(copy); // { a: 1, b: 2 }


2️⃣Оператор расширения (spread operator)

Оператор расширения (...) также можно использовать для создания поверхностной копии объекта.
const original = { a: 1, b: 2 };
const copy = { ...original };
console.log(copy); // { a: 1, b: 2 }


Глубокое копирование

1️⃣JSON.parse и JSON.stringify

Этот метод преобразует объект в строку JSON, а затем обратно в объект, создавая тем самым глубокую копию. Однако он имеет ограничения, такие как невозможность копирования функций и потеря undefined значений.
const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));
console.log(copy); // { a: 1, b: { c: 2 } }


2️⃣Рекурсивная функция

Можно написать свою рекурсивную функцию для глубокого копирования объекта.
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}

if (Array.isArray(obj)) {
const arrCopy = [];
for (let i = 0; i < obj.length; i++) {
arrCopy[i] = deepCopy(obj[i]);
}
return arrCopy;
}

const copy = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}

const original = { a: 1, b: { c: 2 } };
const copy = deepCopy(original);
console.log(copy); // { a: 1, b: { c: 2 } }


3️⃣Библиотеки для глубокого копирования

Существуют библиотеки, такие как lodash, которые предоставляют готовые функции для глубокого копирования объектов.
const _ = require('lodash');
const original = { a: 1, b: { c: 2 } };
const copy = _.cloneDeep(original);
console.log(copy); // { a: 1, b: { c: 2 } }


Для поверхностного копирования объектов можно использовать Object.assign или оператор расширения (...). Для глубокого копирования можно использовать JSON.parse и JSON.stringify, написать рекурсивную функцию или воспользоваться библиотекой, такой как lodash.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍394🤔3
🤔 Какой метод объединяет два массива?
Anonymous Quiz
69%
concat
21%
join
7%
split
3%
splice
👍131
В чём разница между сессией и куком ?
Спросят с вероятностью 7%

Сессии и куки — это два различных способа хранения данных в веб-приложениях, и у них есть свои особенности и случаи применения. Вот основные различия между ними:

Куки (Cookies)

1️⃣Хранение данных на клиенте:
Куки хранятся в браузере пользователя. Это небольшие кусочки данных, которые веб-сервер отправляет браузеру, и браузер сохраняет их и отправляет обратно на сервер с каждым запросом.

2️⃣Долговременное хранение:
Куки могут иметь установленный срок действия и могут сохраняться на длительное время (например, несколько дней, недель или даже лет), если это явно указано при их создании.

3️⃣Использование для идентификации:
Куки часто используются для сохранения информации о пользователе, такой как предпочтения, идентификаторы сессий или данные для авторизации.

4️⃣Размер и количество ограничены:
Обычно размер одной куки ограничен 4KB, и браузеры могут ограничивать количество куки (например, до 20-30 на один домен).

5️⃣Безопасность:
Куки могут быть подвержены угрозам безопасности, таким как кража куки (cookie theft) или атаки с подделкой межсайтовых запросов (CSRF). Использование флага HttpOnly помогает защитить куки от доступа через JavaScript, а флаг Secure гарантирует их передачу только по HTTPS.

Пример создания куки:
document.cookie = "username=JohnDoe; expires=Fri, 31 Dec 2024 23:59:59 GMT; path=/";


Сессии (Sessions)

1️⃣Хранение данных на сервере:
Данные сессии хранятся на сервере, а не в браузере пользователя. Браузер хранит только идентификатор сессии (обычно в куке), который используется для связи данных сессии с конкретным пользователем.

2️⃣Кратковременное хранение:
Сессии, как правило, предназначены для хранения данных в течение одного сеанса работы пользователя (например, до закрытия браузера или истечения времени бездействия). Данные сессии удаляются, когда сессия заканчивается.

3️⃣Использование для хранения состояния:
Сессии используются для хранения состояния пользователя между запросами, таких как состояние авторизации, содержимое корзины покупок и другие временные данные.

4️⃣Размер и масштабируемость:
Поскольку данные сессии хранятся на сервере, размер их ограничен только серверными ресурсами. Это позволяет хранить больше данных по сравнению с куки.

5️⃣Безопасность:
Сессии обычно считаются более безопасными, так как данные не передаются с каждым запросом и хранятся на сервере. Однако нужно заботиться о безопасности идентификаторов сессий, чтобы предотвратить атаки, такие как угон сессий (session hijacking).

Пример создания сессии на сервере (с использованием Express.js):
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);


Куки хранятся в браузере пользователя, могут быть долговременными и используются для хранения небольших данных, таких как идентификаторы и предпочтения.
Сессии хранятся на сервере, обычно кратковременные и используются для хранения состояния пользователя между запросами.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥107🤯2
В чём разница между event.Preventdefault и event.Stoppropagation ?
Спросят с вероятностью 7%

event.preventDefault() и event.stopPropagation() — это два метода, которые используются для управления поведением событий в JavaScript. Они выполняют разные задачи и полезны в различных сценариях.

event.preventDefault()

Предотвращает поведение браузера по умолчанию для события. Это может быть полезно, когда вы хотите отменить действие, которое обычно происходит при определенном событии.

Примеры:

1️⃣Отмена отправки формы:
document.querySelector('form').addEventListener('submit', function(event) {
event.preventDefault();
console.log('Форма не отправлена!');
});


2️⃣Отмена перехода по ссылке:
document.querySelector('a').addEventListener('click', function(event) {
event.preventDefault();
console.log('Переход по ссылке отменен!');
});


event.stopPropagation()

Предотвращает дальнейшее распространение события по дереву DOM. Это полезно, когда вы хотите остановить событие от всплытия (bubbling) или захвата (capturing) к родительским элементам.

Примеры:

1️⃣Остановка всплытия события:
document.querySelector('.child').addEventListener('click', function(event) {
event.stopPropagation();
console.log('Клик на child');
});

document.querySelector('.parent').addEventListener('click', function() {
console.log('Клик на parent');
});


В этом примере клик на .child элемент не вызовет обработчик клика на .parent элементе.

Сравнение

`event.preventDefault()`:
Предотвращает действие браузера по умолчанию.
Примеры: отмена отправки формы, отмена перехода по ссылке.
efault() и event.stopPropag
Останавливает дальнейшее распространение события по дереву DOM.
Примеры: остановка всплытия события от дочернего элемента к родительскому.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍256
Как можно оптимизировать перерисовки ?
Спросят с вероятностью 7%

Оптимизация перерисовок (или "repaints" и "reflows") в веб-приложениях является важной задачей для обеспечения высокой производительности и плавности интерфейса. Вот несколько методов и стратегий, которые можно использовать для оптимизации перерисовок:

1️⃣Минимизация количества изменений в DOM

Используйте Document Fragments:
Вместо многократного добавления элементов в DOM, добавляйте их в 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:

Группируйте несколько изменений DOM в одно действие. Это уменьшает количество вызовов для перерисовки.

2️⃣Избегайте синхронных изменений стилей и компоновки

CSS класс:
Вместо изменения нескольких отдельных стилей, измените один класс.
    element.style.width = '100px';
element.style.height = '100px';
element.style.backgroundColor = 'red';


Вместо этого используйте класс:
    .new-style {
width: 100px;
height: 100px;
background-color: red;
}



Избегайте чтения свойств, вызывающих перерисовку:
Чтение некоторых свойств, таких как offsetHeight или offsetWidth, после изменения стилей, заставляет браузер выполнять немедленную перерисовку. Избегайте таких действий.

3️⃣Используйте CSS для анимаций

CSS анимации и трансформации:
Используйте CSS для анимаций и трансформаций, так как они могут выполняться на уровне GPU, что снижает нагрузку на основной поток.
    .animated {
transition: transform 0.3s;
transform: translateX(100px);
}


4️⃣Дебаунс и троттлинг

Debouncing и Throttling:
Используйте дебаунс и троттлинг для событий, которые происходят часто (например, 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));


5️⃣Виртуальный DOM

Использование библиотек с виртуальным DOM:
Библиотеки, такие как React, используют виртуальный DOM, чтобы минимизировать количество изменений в реальном DOM, что значительно улучшает производительность.

6️⃣Избегайте использования layout thrashing

Layout Thrashing:
Это происходит, когда чередуются операции записи и чтения из DOM, что вызывает множественные перерисовки.
    const height = element.offsetHeight;
element.style.height =out;
return func


Сгруппируйте чтения и записи отдельно:
const height = element.offsetHeight;
element.style.height = ${height + 10}px;



7️⃣Избегайте глубоких вложенностей в DOM

Меньше вложенностей:

Старайтесь минимизировать глубину вложенности элементов, так как это может усложнить перерисовку и компоновку.

8️⃣Оптимизация стилей

Уменьшите количество правил и селекторов:

Сложные CSS-селекторы могут замедлить работу браузера. Используйте более простые селекторы и старайтесь избегать вложенных правил.

9️⃣Использование will-change

will-change:

Используйте свойство will-change, чтобы заранее сообщить браузеру о планируемых изменениях, что позволяет оптимизировать рендеринг.
.will-change-transform {
will-change: transform;
}



Для оптимизации перерисовок в веб-приложениях, минимизируйте изменения в DOM, используйте CSS для анимаций, применяйте дебаунс и троттлинг для событий, избегайте layout thrashing, уменьшайте глубину вложенностей в DOM и используйте библиотеки с виртуальным DOM. Эти методы помогают улучшить производительность и плавность интерфейса.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍346🔥5
Что такое falsy значения ?
Спросят с вероятностью 7%

"falsy" (ложные) значения — это значения, которые при приведении к логическому типу (Boolean) дают false. Эти значения часто используются в условиях (например, в if выражениях) для проверки истинности или ложности.

Основные значения:

1️⃣false:
Само значение false является ложным.
  if (false) {
console.log('Это не выполнится');
}


2️⃣0 и -0:
Нулевые значения считаются ложными.
if (0) {
console.log('Это не выполнится');
}


if (-0) {
console.log('Это тоже не выполнится');
}


3️⃣"" (пустая строка):
Пустая строка считается ложной.
if ("") {
console.log('Это не выполнится');
}



4️⃣null:
Значение null также является ложным.
if (null) {
console.log('Это не выполнится');
}



5️⃣undefined:
Значение undefined является ложным.
if (undefined) {
console.log('Это не выполнится');
}



6️⃣NaN (Not-a-Number):
Специальное значение NaN, которое обозначает нечисловое значение, считается ложным.
if (NaN) {
console.log('Это не выполнится');
}



Примеры

1️⃣Условные операторы:

const value = 0;

if (!value) {
console.log('value является falsy'); // Это выполнится
}



2️⃣Логические операторы:

Логические операторы могут быть использованы для проверки на "falsy" значения.
const value = null;
const result = value || 'Значение по умолчанию';
console.log(result); // 'Значение по умолчанию'



3️⃣Функции с параметрами по умолчанию:

Функции могут использовать "falsy" значения для предоставления параметров по умолчанию.
function greet(name) {
name = name || 'гость';
console.log('Привет, ' + name);
}

greet(); // Привет, гость
greet('Алиса'); // Привет, Алиса



"Falsy" значения — это значения, которые приводятся к false в логическом контексте. Основные "falsy" значения: false, 0, -0, "", null, undefined, NaN. Эти значения часто используются в условиях для проверки их истинности или ложности.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍264
🤔 Какое свойство объекта функции указывает на её контекст исполнения?
Anonymous Quiz
2%
caller
14%
context
6%
scope
78%
this
👍10😁3
Как работает promiseall ?
Спросят с вероятностью 7%

Promise.all — это метод, который позволяет обрабатывать несколько промисов одновременно и возвращает один промис, который завершится, когда все переданные промисы будут выполнены (или когда один из них будет отклонен).

Основные особенности:

1️⃣Параллельное выполнение промисов:
Promise.all принимает массив промисов и выполняет их параллельно. Он завершится успешно, когда все промисы в массиве будут выполнены.

2️⃣Возвращает один промис:
Метод возвращает один промис, который:
Выполняется с массивом результатов, если все промисы в массиве были успешно выполнены.
Отклоняется с причиной отклонения первого промиса, который был отклонен.

3️⃣Отклонение при первой ошибке:
Если один из промисов в массиве отклоняется, Promise.all сразу отклоняет весь промис, не дожидаясь выполнения остальных.

Синтаксис
Promise.all(iterable);


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 принимает массив промисов и возвращает один промис, который выполняется, когда все промисы в массиве выполнены успешно, или отклоняется, если любой из промисов отклонен. Он позволяет обрабатывать несколько асинхронных операций параллельно и возвращает массив результатов всех промисов.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍253
🤔 Какое значение вернёт выражение typeof null?
Anonymous Quiz
14%
undefined
25%
null
60%
object
1%
function
🔥6
В чем отличие map от обычного объекта ?
Спросят с вероятностью 7%

Объекты и Map используются для хранения пар ключ-значение. Однако, у них есть различия, которые могут сделать Map более подходящим для определенных задач по сравнению с обычными объектами. Вот основные отличия:

1️⃣Типы ключей

Объекты: Ключами могут быть только строки или символы. Другие типы, такие как числа или объекты, автоматически преобразуются в строки.
    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'


Map: Ключами могут быть любые значения, включая объекты, функции и примитивы.
    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'


2️⃣Итерация

Объекты: Осуществляется с помощью циклов 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: Имеет встроенные методы для итерации, такие как 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));


3️⃣Сохранение порядка

Объекты: Порядок свойств в объектах не гарантирован, хотя современные реализации JavaScript сохраняют порядок добавления свойств.

Map: Порядок добавления пар ключ-значение всегда сохраняется.

4️⃣Производительность

Объекты: Использование объектов может быть быстрее для создания и доступа к свойствам, но это зависит от реализации в конкретной среде выполнения.

Map: Map оптимизирован для частого добавления и удаления ключей и значений.

5️⃣Методы и свойства

Объекты: Не имеют встроенных методов для работы с коллекцией ключей и значений.

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


6️⃣Прототипное наследование

Объекты: Имеют цепочку прототипов, которая может приводить к коллизиям имен свойств с прототипами.
    const obj = { a: 1 };
console.log(obj.toString); // [Function: toString] - свойство унаследовано от Object.prototype


Map: В Map нет такой проблемы, так как он не использует цепочку прототипов для хранения данных.
    const map = new Map();
map.set('a', 1);
console.log(map.toString); // [Function: toString] - метод самого Map, а не его данных


Объекты используют строки и символы как ключи, их итерация может быть менее удобной, и они могут сталкиваться с проблемами прототипного наследования.
Map поддерживает любые типы ключей, сохраняет порядок вставки, предоставляет удобные методы для работы с коллекцией и оптимизирован для частых операций добавления и удаления.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍306🔥3
Что такое ts ?
Спросят с вероятностью 7%

TypeScript (TS) — это язык с открытым исходным кодом, разработанный и поддерживаемый Microsoft. Является строгой надстройкой над JavaScript, которая добавляет статическую типизацию и другие возможности, упрощая разработку больших и сложных приложений.

Основные особенности

1️⃣Статическая типизация:
Позволяет указывать типы переменных, параметров функций и возвращаемых значений. Это помогает выявлять ошибки на этапе компиляции, а не во время выполнения, что делает код более надежным и упрощает отладку
      let age: number = 25;
let name: string = "Alice";

function greet(name: string): string {
return `Hello, ${name}`;
}


2️⃣Совместимость:
TypeScript полностью совместим. Любой корректный JavaScript-код также является корректным TypeScript-кодом. Это позволяет постепенно внедрять TypeScript в существующие проекты.

3️⃣Поддержка современных возможностей:
Поддерживает все современные стандарты JavaScript (ES6 и выше), а также предоставляет дополнительные возможности, такие как декораторы и асинхронные функции.

4️⃣Расширенные возможности ООП (объектно-ориентированного программирования):
Добавляет возможности, такие как классы, интерфейсы, абстрактные классы и модификаторы доступа (public, private, protected).
      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


5️⃣Типы данных и интерфейсы:
TypeScript позволяет определять собственные типы и интерфейсы, что делает код более выразительным и понятным.
      interface User {
id: number;
name: string;
email: string;
}

const user: User = {
id: 1,
name: "Alice",
email: "alice@example.com"
};


6️⃣Инструменты разработки:
Благодаря статической типизации и метаданным, TypeScript обеспечивает улучшенное автодополнение, рефакторинг и навигацию по коду в популярных редакторах кода, таких как Visual Studio Code.

7️⃣Компиляция:
Компилируется (или транслируется) в JavaScript. Это означает, что код TypeScript преобразуется в JavaScript, который затем может выполняться в любом браузере или среде выполнения JavaScript.
      // TypeScript
let message: string = "Hello, TypeScript";

// Компилированный JavaScript
var message = "Hello, TypeScript";


Создание простого проекта может включать следующие шаги:

1️⃣Установка TypeScript:
      npm install -g typescript


2️⃣Инициализация проекта TypeScript:
      tsc --init


Это создаст файл tsconfig.json, в котором можно настроить параметры компиляции TypeScript.

3️⃣Создание TypeScript-файла:
      // src/index.ts
const greet = (name: string): string => {
return Hello, ${name};
};

console.log(greet("TypeScript"));


4️⃣Компиляция TypeScript в JavaScript:
      tsc


Это создаст файл index.js в папке dist или другой указанной папке.

5️⃣Запуск скомпилированного JavaScript-кода:
      node dist/index.js


TypeScript — он является строгой надстройкой над JavaScript. Он добавляет статическую типизацию, улучшенные возможности ООП, поддержку современных стандартов JavaScript и улучшенные инструменты разработки. TypeScript компилируется в JavaScript, что позволяет использовать его в любых средах выполнения JavaScript.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍246
Для чего нужны map, set ?
Спросят с вероятностью 7%

Map и Set — это структуры данных, введенные в ECMAScript 6 (ES6), которые предоставляют дополнительные возможности и более гибкую работу с коллекциями данных по сравнению с традиционными объектами и массивами. Вот основные особенности и случаи их использования:

Map

Это структура данных, которая позволяет хранить пары ключ-значение и поддерживает любые типы данных в качестве ключей.

Основные особенности:

1️⃣Любые типы ключей:
В ней ключами могут быть любые значения, включая объекты, функции и примитивы. Это отличает Map от объектов, где ключи могут быть только строками или символами.
      const map = new Map();
map.set('a', 1);
map.set(1, 'one');
map.set({}, 'object');
map.set(function() {}, 'function');
console.log(map);


2️⃣Сохранение порядка:
Сохраняет порядок вставки элементов, что позволяет итерировать по элементам в порядке их добавления.

3️⃣Итерируемость:
Имеет встроенные методы для итерации, такие как map.keys(), map.values(), и map.entries(), что упрощает работу с коллекцией данных.

4️⃣Методы и свойства:
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 каждое значение может присутствовать только один раз.

Основные особенности:

1️⃣Только уникальные значения:
Set автоматически удаляет дубликаты значений, что позволяет легко создавать коллекции уникальных элементов.

2️⃣Итерируемость:
Set поддерживает итерацию и имеет встроенные методы для работы с коллекцией данных.

3️⃣Методы и свойства:
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:
Map предоставляет более гибкую работу с парами ключ-значение, поддерживая любые типы данных в качестве ключей и сохраняя порядок вставки.
Set предоставляет коллекцию уникальных значений и автоматически удаляет дубликаты.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍265🔥1
В чем разница uselayuouteffect и useeffect ?
Спросят с вероятностью 7%

useEffect и useLayoutEffect — это хуки, которые позволяют выполнять побочные эффекты в функциональных компонентах. Оба они предназначены для выполнения кода после рендеринга компонента, но их поведение различается по времени выполнения и влиянию на рендеринг.

useEffect

Когда выполняется:
Выполняется после того, как браузер закончил обновлять DOM. Это означает, что все изменения в DOM уже произошли, и браузер уже отрисовал интерфейс.

Основное использование:
Используется для выполнения побочных эффектов, которые не блокируют отрисовку, таких как сетевые запросы, подписки на события, манипуляции с DOM (не критичные к рендерингу) и регистрация таймеров.

Поведение:
Не блокирует рендеринг. Это означает, что пользователь может видеть обновленный интерфейс перед выполнением побочного эффекта.

Пример:
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

Когда выполняется:
Выполняется синхронно после всех мутировавших эффектов DOM, но перед тем, как браузер обновит экран. Это означает, что изменения, сделанные в useLayoutEffect, будут видны пользователю до того, как браузер нарисует обновленный интерфейс.

Основное использование:
Используется для выполнения побочных эффектов, которые должны произойти до отрисовки интерфейса, таких как измерение размеров DOM-элементов, выполнение синхронных изменений в DOM, которые должны произойти перед отрисовкой, или выполнение операций, которые блокируют отрисовку.

Поведение:
Блокирует отрисовку до тех пор, пока эффект не будет выполнен. Это может привести к задержке в отображении интерфейса, если эффект выполняется долго.

Пример:
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;


Основные различия

1️⃣Время выполнения:
useEffect выполняется асинхронно после того, как браузер обновил экран.
useLayoutEffect выполняется синхронно перед тем, как браузер обновит экран.

2️⃣Использование:
useEffect лучше подходит для побочных эффектов, которые не влияют на компоновку и отрисовку интерфейса.
useLayoutEffect лучше подходит для побочных эффектов, которые должны быть выполнены перед отрисовкой, таких как измерение или изменения в DOM.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍82
Для чего нужен promiseall ?
Спросят с вероятностью 7%

Promise.all — это метод, который позволяет обрабатывать несколько промисов одновременно и возвращает один промис, который завершается, когда все переданные промисы либо выполнены, либо один из них отклонен. Он полезен для выполнения нескольких асинхронных операций параллельно и для управления их результатами.

Основные особенности

1️⃣Параллельное выполнение промисов:
Позволяет выполнять несколько асинхронных операций параллельно. Это особенно полезно, когда результаты этих операций независимы друг от друга.

2️⃣Единый промис в ответ:
Promise.all возвращает новый промис, который:
Завершается успешно, когда все промисы в массиве выполнены.
Отклоняется, если любой из промисов в массиве отклоняется.

3️⃣Сбор результатов:
Когда все промисы успешно выполнены, результирующий промис разрешается массивом результатов всех переданных промисов.

Синтаксис
Promise.all(iterable);


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 используется для выполнения нескольких асинхронных операций параллельно и возвращает один промис, который разрешается массивом результатов, если все промисы выполнены успешно, или отклоняется, если любой из промисов отклоняется. Это полезно для управления несколькими асинхронными задачами одновременно.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍241
🤔 Какое из следующих ключевых слов используется для создания модуля в ECMAScript 6?
Anonymous Quiz
52%
module
40%
export
4%
include
3%
package
👍161
Что означает слово специфичность в css ?
Спросят с вероятностью 7%

Специфичность (specificity) — это механизм, который браузеры используют для определения приоритета применяемых стилей. Специфичность определяет, какие правила CSS будут применены к элементу, когда существуют конфликтующие правила. Она рассчитывается на основе различных типов селекторов, используемых в правиле CSS.

Основные концепции

1️⃣Типы селекторов и их веса:
Специфичность определяется по типу селекторов, и каждый тип имеет свой вес. В порядке увеличения специфичности:

Элементы и псевдоэлементы (div, h1, p, ::before, ::after): вес 1.
Классы, атрибуты и псевдоклассы (.class, [type="text"], :hover, :nth-child): вес 10.
Идентификаторы (#id): вес 100.
Инлайновые стили (стили, заданные непосредственно в элементе с атрибутом style): вес 1000.
Важные правила (!important): не учитывают специфичность, а просто переопределяют другие правила.

2️⃣Правила вычисления специфичности:
Специфичность CSS выражается в виде чисел (a, b, c, d), где:
a — количество инлайновых стилей (1 или 0).
b — количество идентификаторов.
c — количество классов, атрибутов и псевдоклассов.
d — количество элементов и псевдоэлементов.

Примеры расчета специфичности

1️⃣Элементы и псевдоэлементы:
      div { color: red; } /* Специфичность: 0, 0, 0, 1 */
p::before { content: ''; } /* Специфичность: 0, 0, 0, 2 */


2️⃣Классы, атрибуты и псевдоклассы:
      .example { color: blue; } /* Специфичность: 0, 0, 1, 0 */
[type="text"] { color: green; } /* Специфичность: 0, 0, 1, 0 */
:hover { color: yellow; } /* Специфичность: 0, 0, 1, 0 */


3️⃣Идентификаторы:
      #unique { color: orange; } /* Специфичность: 0, 1, 0, 0 */


4️⃣Инлайновые стили:
      <div style="color: purple;"></div> <!-- Специфичность: 1, 0, 0, 0 -->


5️⃣Комбинированные селекторы:
#unique .example:hover { color: pink; } /* Специфичность: 0, 1, 1, 1 */


Если два или более правил CSS применяются к одному и тому же элементу, приоритет будет у правила с наибольшей специфичностью.
<!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

Правила с ним имеют наивысший приоритет и могут переопределить даже те стили, которые имеют более высокую специфичность. Тем не менее, злоупотребление !important может затруднить управление стилями и отладку.
p { color: red !important; } /* Перебивает все другие правила */


Специфичность пределяет приоритет применяемых стилей на основе типов селекторов и их веса. Она используется браузером для разрешения конфликтов между различными правилами CSS, чтобы определить, какие стили применяются к элементу.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍15🔥2
🤔 Какой метод используется для остановки распространения события в JavaScript?
Anonymous Quiz
27%
preventDefault()
6%
stopImmediatePropagation()
5%
cancelEvent()
62%
stopPropagation()
👍10😁3🎉1
Forwarded from Идущий к IT
10$ за техническое собеседование на английском языке:

1. Отправьте запись технического собеседования на английском языке файлом на этот аккаунт
2. Добавьте ссылку на вакансию или пришлите название компании и должность
3. Напишите номер кошелка USDT (Tether) на который отправить 10$

🛡 Важно:

– Запись будет использована только для сбора данных о вопросах
– Вы останетесь анонимны
– Запись нигде не будет опубликована

🤝 Условия:

– Внятный звук, различимая речь
– Допустимые профессии:
• Любые программисты
• DevOps
• Тестировщики
• Дата сайнтисты
• Бизнес/Системные аналитики
• Прожекты/Продукты
• UX/UI и продукт дизайнеры
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
Что известно про преобразование типов ?
Спросят с вероятностью 7%

Преобразование типов — это процесс приведения значения из одного типа в другой. JavaScript, как язык с динамической типизацией, автоматически преобразует типы значений, когда это необходимо, но также позволяет разработчикам явно выполнять преобразования типов.

Виды преобразования

1️⃣Неявное (автоматическое):
Это преобразование, которое происходит автоматически при выполнении операций с разными типами данных. Например, при сложении числа и строки JavaScript автоматически преобразует число в строку.

2️⃣Явное:
Это преобразование, которое выполняется разработчиком явно с использованием встроенных функций или операторов.

Примеры неявного

1️⃣Строковое преобразование:
При конкатенации строки с числом число автоматически преобразуется в строку.
      const result = 'The answer is ' + 42;
console.log(result); // 'The answer is 42'


2️⃣Числовое преобразование:
При выполнении арифметических операций строка, содержащая число, автоматически преобразуется в число.
      const result = '42' - 10;
console.log(result); // 32


3️⃣Логическое преобразование:
В логическом контексте (например, в условиях 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
}


Примеры явного

1️⃣Преобразование в строку:
Для явного преобразования в строку можно использовать метод String() или оператор + с пустой строкой.
      const num = 42;
const str1 = String(num);
const str2 = num + '';

console.log(str1); // '42'
console.log(str2); // '42'


2️⃣Преобразование в число:
Для явного преобразования в число можно использовать функции 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


3️⃣Преобразование в логическое значение:
Для явного преобразования в логическое значение можно использовать функцию 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 |


Преобразование типов — это процесс приведения значения из одного типа в другой. Оно может происходить автоматически (неявное преобразование) или выполняться разработчиком явно (явное преобразование). Предоставляет функции и методы для преобразования в строки, числа и логические значения.

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1429 вопроса на Frontend разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍1211