100pr вопросы Flashcards

1
Q

Event loop (цикл событий). Микрозадачи и макрозадачи

A

ЦИКЛ СОБЫТИЙ
Цикл событий предоставляется средой выполнения. например браузер или node js. Представляет собой две очереди из микро и макро задач.
Как выполняется код в js.
Синхронные события попадают в call stack. Асинхронные События распределяются по очередям (fifo) microtask и macrotask.

По выполнению сначало выполняется весь синхронный код, затем выполняются все микротаски, Затем выполняется одна макротаска И все заново.
Выполняется весь синхронный код…

Микрозадачи - промисы, функции добавленные с помощью queueMicrotask(func)
MutationObserver

Макрозадачи -
setTimeout
setInterval
Запросы к серверу через XMLHttpRequest или fetch

(((((((
синхронный код у нас попадает в callstack (lifo с помощью которой можно отслеживать порядок вызова функций). Выполняется и убирается из callstack

JS- однопоточный язык. В текущий момент времени может выполняться только одна задача. Но возникает необходимость выполнять код асинхронно (допустим для выполнения трудоемкой функции) ДЛя этого и появляется event loop.

Event loop это бесконечный цикл который выполняет задачи, ожидается задачи если все задачи выполнены, как только они появились опять их выполняет.

Есть основной поток выполнения.
После основного потока выполняются микрозадачи.
После микрозадач выполняются макрозадачи
))))))

В event loop может быть переполнения стека вызова.

Цикл событий предоставляется средой выполнения. например браузер или node js

Если call stack предоставляет js, а event loop предоставляет среда выполнения, как они общаются между собой? У каждого браузера есть Web api, которое предоставляет setTimeout, отправку фетч запросов, это все не спецификации js, это все функции браузера.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Копирование объектов и ссылки. Поверхностное и глубокое копирование

A

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

Переменная, которой присвоен объект, хранит не сам объект, а его «адрес в памяти» – другими словами, «ссылку» на него.

Глубокое клонирование:
structuredClone(obj)
lodash.cloneDeep(obj)
JSON.parse(JSON.stringify(obj))
(копирует не все данные, date and function, symbol превратятся в undefined)

Поверхностное клонирование:
Оператор Spread
Object.assign({},{})
Object.create({})

Метод structuredClone может выполнять следующие задачи:
Клонировать бесконечно вложенные объекты и массивы;
Клонировать циклические ссылки;
Клонировать различные типы JS, такие, как Date, Error, RegExp, ArrayBuffer, Blob, File, ImageData

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое замыкание (Closures)?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое поднятие (Hoisting)?

A

Поднятие — это термин, описывающий подъем переменной или функции в глобальную или функциональную области видимости.
Var и function всплывают в самый верх функциональной области видимости.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое область видимости (Scope)?

A

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

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

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

(((((((
Блочная -например if for
Функциональная - в теле функции
Глобальная - можно обратиться из любого место в коде к переменной

При создании области видимости она запоминает ссылку на внешнюю область видимости. Таким образом получаются цепочки области видимости. Мы из одной области видимости можем обращаться за переменными из другой области видимости
)))))))))

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

В чем разница между обычной функцией и функциональным выражением

A

Function extentioin поднимается в отличие от Functioin declaration.

(((((((((((
Вызов notHoistedFunc приведет к ошибке, а вызов hoistedFunc нет, потому что hoistedFunc «всплывает», поднимается в глобальную область видимости, а notHoistedFunc нет.

hoistedFunc()
notHoistedFunc()

function hoistedFunc(){
console.log(‘I am hoisted’)
}

var notHoistedFunc = function(){
console.log(‘I will not be hoisted!’)
}
))))))))))))

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое запоминание или мемоизация (Memoization)?
useCallback и useMemo, их отличия

A

Мемоизация — это прием создания функции, способной запоминать ранее вычисленные результаты или значения.

Преимущество мемоизации заключается в том, что мы избегаем повторного выполнения функции с одинаковыми аргументами.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Стрелочные функции. Отличия от других функции

A
  • У стрелочных функций нет «this»
  • Стрелочные функции не имеют «arguments»
  • Стрелочные функции не допускают дублирования имен аргументов
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Стeк (LIFO) и Очередь (FIFO)

A

Стек — это структура данных, которая работает по принципу LIFO (Last In, First Out), что означает «последним пришёл — первым вышел». К примеру, вы моете посуду и ставите тарелки друг на друга. Если захотите вытереть их, то первой возьмёте последнюю помытую тарелку. Это и есть принцип работы стека.

Очередь — это структура данных, которая работает по принципу FIFO (First In, First Out), что означает «первым пришёл — первым обслужен». Её можно сравнить с очередью за вкусными пироженками: первый человек, который пришёл, будет первым, кто получит пирожное.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое промис

A

Промис (Promise) — специальный объект JavaScript, который используется для написания и обработки асинхронного кода.
Асинхронные функции возвращают объект Promise в качестве значения. Внутри промиса хранится результат вычисления, которое может быть уже выполнено или выполнится в будущем.

Промис может находиться в одном из трёх состояний:
pending — стартовое состояние, операция стартовала;
fulfilled — получен результат;
rejected — ошибка.

После создания, промис находится в состоянии ожидания pending. Когда асинхронная операция завершается, функция переводит промис в состояние успеха fulfilled или ошибки rejected.
С помощью методов then(), catch() и finally() мы можем реагировать на изменение состояния промиса и использовать результат его выполнения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Async/await

A

Существует специальный синтаксис для работы с промисами, который называется «async/await»

async перед функцией гарантирует, что эта функция в любом случае вернёт промис.

Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока промис справа от await не выполнится. После чего оно вернёт его результат, и выполнение кода продолжится.

Когда промис завершается успешно, await promise возвращает результат. Когда завершается с ошибкой – будет выброшено исключение. Как если бы на этом месте находилось выражение throw.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Селекторы CSS

A

В CSS-селекторы используются для стилизации HTML элементов на веб-странице.

Разные типы селекторов имеют разный приоритет.

Селектор по тегу: 1
Селектор по классу (html атрибуты): 10
Селектор по ID: 100
Inline-стиль: 1000

!important - служит для того чтобы применить этот стиль игнорируя приоритеты

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Псевдоклассы, псевдоелементы

A

Псевдоэдементы - в основном
::before
::after
::placeholder

Псевдоэдементы - можно использовать для добавления стилей или какого-либо контента

Псевдоклассы -
:hover
:first-child
:last-child

Псевдоклассы - это селектор, который выбирает элементы, находящиеся в специфическом состоянии.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Методы жизненного цикла компонента?

A

Методы жизненного цикла – это способ подключения к различным этапам жизненного цикла компонента, позволяющий выполнять определенный код в определенное время. Вот список основных методов:

constructor – первый метод, вызываемый при создании компонента. Он используется для инициализации состояния. В функциональных компонентах для аналогичных целей используется хук useState.

render – отвечает за рендеринг JSX-разметки и возвращает содержимое, которое будет выведено на экран.

componentDidMount – вызывается сразу после рендеринга компонента в DOM. Обычно используется для задач инициализации, таких как вызов API или настройка слушателей событий.

componentDidUpdate – вызывается при изменении реквизитов или состояния компонента. Позволяет выполнять побочные эффекты, обновлять компонент на основе изменений или запускать дополнительные вызовы API.

componentWillUnmount – вызывается непосредственно перед удалением компонента из DOM. Используется для очистки ресурсов, которые были установлены в
componentDidMount, например, для удаления слушателей событий или отмены таймеров.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое React.memo()

A

React.memo() – это компонент высшего порядка, который используется для оптимизации производительности веб-приложений. Если компонент, который вы хотите оптимизировать, всегда отображает один и тот же результат с неизменными реквизитами (props), вы можете обернуть его вызов в React.memo, чтобы запомнить его результат. Таким образом, React может использовать последний отрендеренный результат этого компонента вместо того, чтобы снова его рендерить, если входные данные не изменились. Это помогает оптимизировать производительность, так как повторный рендеринг может быть затратным по ресурсам. Важно отметить, что React.memo влияет только на изменение входных данных (реквизитов): если функциональный компонент, обернутый в React.memo, использует useState, useReducer или useContext для изменения своего состояния или контекста, он все равно будет перерисован при изменении этих состояний или контекстов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое реакт, зачем он нужен

A

Преимущество использования это виртуальное дерево, компонентный подход, их переиспользование, однонаправленный поток данных. Все это нужно для разработки более оптимизированных интерфейсов, для ускорения разработки.

17
Q

Что такое React Reconciliation?(используется в virtual dom)

A

React использует алгоритм согласования (reconciliation) для определения изменений между старым и новым деревом виртуального DOM.
сложность алгоритма O(n)

Эвристический алгоритм. Строится на двух допущениях

Всякий раз, когда изменяется тип элемента, React сносит старое дерево и строит новое дерево с нуля. Это приводит к перестройке Dom дерева.

Можем использовать ключи для избежания лишних перерисовок элементом

<div>
<Counter></Counter>
</div>

<span></span>

<Counter></Counter>

</span>

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

18
Q

batching

A

Пакетирование (batching) - это когда React группирует несколько асинхронных операций в одну и тем самым уменьшая повторный ререндеринг компонент.

19
Q

Прототипное наследование. [[Prototype]], .__proto__

A

Prototype есть только у классов и function decloration. У остальных типов данных его нету.

__proto__ seter/geter который ссылается на прототип функции конструктора с потощью которой этот объект был создан.

В JavaScript все объекты имеют скрытое свойство [[Prototype]], которое является либо другим объектом, либо null.

Можем использовать obj.__proto__ для доступа к нему (исторически обусловленный геттер/сеттер)

Объект, на который ссылается [[Prototype]], называется «прототипом».

Если мы хотим прочитать свойство obj или вызвать метод, которого не существует у obj, тогда JavaScript попытается найти его в прототипе.

let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // (*)

// теперь мы можем найти оба свойства в rabbit:
alert( rabbit.eats ); // true (**)
alert( rabbit.jumps ); // true

20
Q

Redux и как он работает

A

Redux — это JS-библиотека для поддерживаемого глобального управления состоянием.

Использует патерн flux.

flux
концепции однонаправленного потока данных.

В стандартной архитектуре Flux следующие компоненты:

Actions — даные содердащие имя действия которое нужно выполнить. Может содержать полезную нашрузку относящуюся к этим действиям.

Dispatcher — предназначен для передачи действий хранилищам.

Stores — действуют как контейнеры для состояния приложения и логики. Реальная работа приложения происходит в Stores

View — компонент, обычно отвечающий за выдачу информации пользователю.