javascript Flashcards

1
Q

Какие типы данных присутствуют в JavaScript?

A

Существует 8 типов данных. 7 примитивных и 1 сложный тип данных. Примитивные типы: number, string, boolean, symbol, bigInt, null, undefined. Сложный тип - object. Он используется для коллекций данных и для объявления более сложных сущностей. Также он передается по ссылке, а простые типы данных по значению

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

Что такое NaN?

A

Глобальное свойство NaN является значением, представляющим не-число (Not-A-Number). Его тип данных number. NaN не равен самому себе. Проверку на NaN можно сделать с помощью Number.isNaN(значение)

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

В чем разница между null и undefined?

A

undefined (неопределенный) представляет собой значение по умолчанию:
1 - переменной, которая обьявлена без инициализации;
2 - функции, которая ничего не возвращает явно;
3 - несуществующего свойства объекта.
null - это значение «отсутствия значения». Присваивается переменной явно.

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

Чем отличается строгое и не строгое равенство (=== и ==)?

A

Строгое сравнивает значения по типу данных и значению
Не строгое приводит значения к одному типу а потом эти значения сравнивает.

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

Почему результатом сравнения двух похожих объектов является false?

A

Потому что объекты - это ссылочные типы данных. 2 одинаковы с виду объекта имеют разные ссылки, и поэтому операция сравнения будет возвращать false.

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

Как проверить 2 объекта на идентичность?

A

1 - использовать JSON.stringify для приведения объектов в строку и сравнить их уже как 2 строки. Такой подход имеет ограничения. Если в объекте будут методы или symbol - JSON.stringify не сможет конвертировать их в строку.
2 - написать или использовать из библиотеки функцию deepEqual которая будет проходить циклом по ключам двух объектов и будет проверять значение этих ключей. Функция должна работать рекурсивно.

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

Как сделать копию объекта?

A

Существует понятие глубокого и поверхносного копирования. Глубокое - это копирование объекта и все его уровней вложенности. Поверхносное - это коприрование только первого уровня вложенности, а для остального копируется ссылка.
Способы поверхностого копирования:
1 - использовать spread оператор (…)
2 - использовать Object.assign()

Способы глубокого копирования:
1 - использовать JSON.stringify - JSON.parse для конвертирования объектва в строку и потом обратно. Имеет ограничения по копированию методов и symbols
2 - написать или использовать из библиотеки функцию deepClone которая будет рекурсивно проходить по ключам объекта и копировать их в новый объект

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

Чем отличаются переменные var, let и const?

A

“var - переменную можно объявить после инициализации, можно изменять, имеет функциональную область видимости, имеет hoisting. Сейчас почти не используют при написании нового кода
let - переменную можно инициализировать после обьявления, можно изменять, имеет блочную область видимости, не имеет hoisting
conts - переменную обязательно нужно инициализировать во-время объявления, нельзя изменять, имеет блочную область видимости, не имеет hoisting

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

Как узнать является ли объект массивом?

A

Для этого можно использовать метод Array.isArray().

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

Какие перебирающие методы массивов вы знаете?

A

Есть следущие методы:
- forEach – для перебора массива.
- filter – для фильтрации массива.
- every – для проверки массива.
- map – для трансформации массива в массив.
- reduce/reduceRight – для прохода по массиву с вычислением значения.
- sort - сортирует массив
- find/findLast/some/findIndex/findLastIndex

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

Как объединить массивы?

A

1 - Можно использовать метод concat()
2 - Можно использоваться оператором spread и распылить эти массив в 1 один общий массив

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

Как узнать находится ли элемент в массиве?

A

1 - Использовать метод includes, который возвращает true если элемент находиться в массиве
2 - Использовать метод indexOf/lastIndexOf который возвращает индекс найденного элемента в массиве или -1 если элемента в массиве нет

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

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

A

Это механизм в JavaScript, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен. Поднимаются переменные var и function declaration

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

Каким будет значение переменной var при обращении к ней до ее объявления?

A

undefined

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

Что будет если обратится к переменной let/const до её объявления?

A

Будет ошибка типа ReferenceError. Cannot access ‘variable’ before initialization

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

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

A

Это часть программы, в пределах которой можно получить доступ к определенным переменным.
Другими словами, она определяет видимость переменной в коде.
JS имеем 6 типов областей видимости: глобальная, функциональная, Eval, блочная (ES6), модульная, лексическая области видимости.

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

Чем Function Declaration отличается от Function Expression?

A

Function Expression создаётся, когда выполнение доходит до него, и затем уже может использоваться.
Function Declaration создается до выполнения кода scope где она была объявлена. И может быть использована во всем этом scope.

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

Чем стрелочная функция отличается от обычной?

A

1 - Стрелочная функция получает this в момент создания из родительского this. В обычной функции this устанавливается во время вызова из контеста вызова.
2 - Стрелочная функция не имеет arguments.
3 - Стрелочная функция не имеет свойства prototype.
4 - Стрелочная функция имеет короткий синтаксис не явного возврата значения.

19
Q

Есть ли аналог arguments для стрелочной функции?

A

Можно использовать rest оператор (…) для того, чтобы собрать все аргументы с которыми вызвана функция в массив.

20
Q

Что такое лексическое окружение (Lexical Environment)?

A

Лексическое окружение в JavaScript — это комбинация текущей области видимости и ссылки на внешнее лексическое окружение.
Внешнее лексическое окружение — это окружение з текущей областью видимости в которой функция была объявлена, и она позволяет функции обращаться к переменным и функциям, определенным в этой внешней среде.

21
Q

Что является глобальным лексическим окружение?

A

window

22
Q

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

A

Замыкание - это возможность функции использовать переменные из ее лексического окружения в котором она была объявлена.
Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт доступ фунции к внешнему лексическому окружению. В итоге по цепочке ссылок на родительское лексическое окружения фунция имеет доступ ко всем лексическим окружениям своих предков. В JavaScript замыкания создаются каждый раз при создании функции, во время её создания.

Это способность функции во время создания запоминать ссылки на переменные функции и параметры, находящиеся в текущем лексическом окружении, а так же в лексическом окружении родительской функции и так до глобальной области видимости. Замыкание подразумевает именно внешние переменные, а не саму функцию.
or
Это способность функции запоминать окружение (значения переменных окружения) в котором она была определена.

23
Q

Для чего используют замыкания?

A

1 - Часто для создания приватных переменных и функций (инкапсуляция).
2 - Для сохранения промежуточных параметров вызова функции (каррирование).
3 - Мемоизация функции.

24
Q

Что такое IIFE?

A

Immediately Invoked Function Expression - это функция, которая вызывается или выполняется сразу же после создания или объявления.

25
Q

Что такое this?

A

this - это ключевое слово в js, значение которого формируется по определенным правилам.
В ES5 - это ссылка на контекст вызова функции (обычной). Контекстом является объект который в данный момент вызывает функцию.
В ES6 - может быть любым значением.
Для стрелочной функции - это this лексического окружения.
1 - this в объекте - указывает на сам объект
2 - this в классе - указывает на экземпляр класса
3 - глобальным контекстом является window (или undefined в режиме use strict)
4 - call, apply, bind задают произвольный this обычной функции.

26
Q

Как можно задать контекст вызова функции?

A

Задать this можно только единожды.
В следующих случаях контекст вызова не сработает:
1. На стрелочную функцию не действуют (bind, call, apply)
2. На функцию, которую возвращает bind не действуют (call, apply)
3. После применения call || apply

27
Q

Можно ли изменить контекст функции которую возвратил метод bind?

A

Нет. Однажды назначив функции this изменить его уже нельзя.

28
Q

Можно ли подменить контекст вызова стрелочной функции?

A

Нет. Однажды назначив функции this (у стрелочной - это во время ее объявления) изменить его уже нельзя.

29
Q

Что такое прототип объекта?

A

Это родительский объект от которого был унаследован текущий объект.

30
Q

Как работает прототипное наследование в JS?

A

Когда мы хотим прочитать свойство из объекта, а оно отсутствует - JS попытается его прочитать из прототипа объекта. Если свойства нет в прототипе, JS попытается его прочиться из прототипа прототипа, и т.д. до тех пор, пока свойство не будет найдено или цепочка прототипов не закончится. JS возвратит либо значение найденного свойства либо undefined.

31
Q

Как создать объект в котором не будет прототипа?

A

Использовать Object.create(null). Данный метод принимает первым аргументом объект, который будет являться прототипом объекта, который он возвратит. Если мы вызовем Object.create() c аргументом null, будет создан объект без прототипа

32
Q

Как проверить является ли свойство объекта личным свойством или это свойство прототипа?

A

Можно использовать метод obj.hasOwnProperty(prop) который возвращает булевое значение.

33
Q

Как запретить изменять объект?

A

Есть метод Object.freeze(), который “замораживает” объект от изменений. Данный метод работает только в одну сторону. Отменить действие данного метода уже невозможно.
Eсть метод Object.seal(), который запечатывает объект, предотвращая добавление новых свойств к объекту и делая все существующие свойства не настраиваемыми. Значения текущих свойств остаются изменяемыми.
Так же есть метод Object.preventExtensions(), который запрещает добавлять новые свойства в объект.

34
Q

Что такое дескрипторы свойства объекта?

A

Дескриптор - это объект конфигурации свойства в объекте. Он имеет 4 свойства:
configurable - указывает можно ли добавлять, удалять или изменять свойство объекта
enumerable - указывает буде ли видно свойство во время перебора свойств объекта
value - значение свойства объекта.
writable - указывает можно ли изменять значаение данного свойства

get - Функция, используемая как геттер свойства
set - Функция, используемая как сеттер свойства

35
Q

Чем отличается функция конструктор и класс?

A

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

36
Q

Что нужно сделать, чтобы метод класса попал в его экземпляр?

A
  1. Такой метод нужно описать внутри конструктора
  2. Задать свойство-функцию методом выражения (foo = function(){})
37
Q

Присутствует ли в JS множественное наследование?

A

Нет. Так как наследование в JS базируется на прототипах, у одного объекта может быть только 1 прототип.

38
Q

Что такое Promise?

A

Это объект который используется для отложенных и асинхронных вычислений. Promise имеет 3 состояния:
- ожидание (pending): начальное состояние, не исполнен и не отклонён.
- исполнено (fulfilled): операция завершена успешно.
- отклонено (rejected): операция завершена с ошибкой.

39
Q

Для чего нужен метод Promise.all?

A

Метод Promise.all(iterable) возвращает промис, который выполнится тогда, когда будут выполнены все промисы, переданные в виде перечисляемого аргумента, или отклонено любой первый из переданных промисов.
Возвращает промис, который будет выполнен когда будут выполнены все промисы, переданные в виде перечисляемого аргумента, или отклонён, если будет отклонено хоть одно из переданных промисов
У него есть аналог Promise.allSetled, который исполняется как-только все полученные промисы завершены (исполнены или отклонены), содержащий массив результатов исполнения полученных промисов.

40
Q

Для чего нужен метод Promise.race?

A

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

41
Q

Для чего нужен синтаксис async/await?

A

Ключевое слово async делает созданную функцию асинхронной.
Асинхронная функция может содержать ключевое слово await, которое приостанавливает выполнение асинхронной функции и ожидает ответа от переданного Promise, затем возобновляя выполнение функции async и возвращая полученное значение.

42
Q

Как обрабатывать ошибки в async/await функции?

A

Для этого можно использовать конструкцию try…catch()

43
Q

Что такое event loop?

A

Это механизм, который отвечает за выполнение кода, сбора и обработки событий и выполнения под-задач из очереди. В концепции event loop есть несколько блоков:
- call stack - отвечает за создаёт контекст выполнения функции. Каждая вызываемая функция попадает в call stack.
- heap - это большая неструктурированная области памяти, в которой хранятся объявленные переменные, функции, и т.д.
- third party API - API, которые предоставляет окружение. К примеру, метод fecth, котрый предоставляется браузером.
- queue - список задач, подлежащих обработке. Каждая задача ассоциируется с некоторой функцией, которая будет вызвана, чтобы обработать эту задачу.