JavaScript Flashcards

1
Q
  1. Які типи даних присутні в 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
  1. Що таке 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
  1. Яка різниця між 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
  1. Чим відрізняється строга і нестрога рівність (=== та ==)?
A

Строга рівність порівнює значення за типом даних та значенням. Нестроге приводить значення до одного типу, а потім ці значення порівнює.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Чому результатом порівняння двох схожих об’єктів є false?
A

Тому що об’єкти - це типи даних, що передаються за посиланням. 2 однакові на вигляд об’єкта мають різні посилання, і тому операція порівняння повертатиме false.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Як перевірити 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
  1. Як зробити копію об’єкта?
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
  1. Чим відрізняються змінні var, let та const?
A

var - змінну можна ініціалізувати після оголошення, можна змінювати, має функціональну область видимості, має hoisting. Зараз майже не використовують під час написання нового коду.

let - змінну можна ініціалізувати після оголошення, можна змінювати, має блокову область видимості, не має hoisting.

const - змінну обов’язково потрібно ініціалізувати під час оголошення, не можна змінювати, має блокову область видимості, не має hoisting.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Як дізнатися чи є об’єкт масивом?
A

Для цього можна використати метод Array.isArray.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Які перебираючі методи масивів ви знаєте?
A

Є такі методи:

  • forEach – для перебору масиву.
  • filter – для фільтрації масиву.
  • every/some – для перевірки масиву.
  • map – для трансформації масиву в масив.
  • reduce/reduceRight – для проходу по масиву з обчисленням значення.
  • sort - сортує масив.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Як об’єднати масиви?
A

1 - Можна використовувати метод concat().
2 - Можна використовувати spread оператор та об’єднати ці масиви в один загальний масив.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Як дізнатися чи знаходиться елемент у масиві?
A

1 - Використати метод includes, який повертає true якщо елемент знаходиться у масиві.
2 - Використати метод indexOf, який повертає індекс знайденого елемента в масиві або -1 якщо елемента в масиві немає.
3 - також можна використати метод find, який повертає знайдений елемент, або повертає undefined.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. Що таке підняття (hoisting)?
A

Це механізм у JavaScript, в якому змінні та оголошення функцій, пересуваються вгору своєї області видимості перед тим, як код буде виконаний. Піднімаються змінні типу var та function declaration.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Яким буде значення змінної var, якщо звернутися до неї до її оголошення?
A

Значенням змінної буде undefined.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. Що буде, якщо звернутися до змінної let/const до її оголошення?
A

Буде помилка типу ReferenceError. Змінної ще не існує

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. Що таке область видимості (Scope)?
A

Це місце, де (або звідки) ми маємо доступ до змінних або функцій. JS має 4 типи областей видимості: глобальна, функціональна, блокова (ES6) та область видимості eval.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q
  1. Чим Function Declaration відрізняється від Function Expression?
A

Function Expression створюється, коли виконання доходить до нього, а потім вже може використовуватися.

Function Declaration можна використовувати у всьому скрипті (або блоці коду, якщо функцію оголошено в блоці).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q
  1. Чим стрілочна функція відрізняється від звичайної?
A

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

19
Q
  1. Чи існує аналог arguments для стрілочної функції?
A

Аналога немає. Але можна використовувати rest оператор (…) для того, щоб зібрати всі параметри з якими викликана функція в масив.

20
Q
  1. Що таке лексичне оточення (Lexical Environment)?
A

Це властивості внутрішнього об’єкта функції, які створюються під час її виклику. Туди записуються аргументи, функції та змінні. Також там знаходиться посилання на зовнішнє лексичне оточення.

21
Q
  1. Що є глобальним лексичним оточенням?
A

У несуворому режимі це window. У суворому - undefined.

22
Q
  1. Що таке замикання (Closures)?
A

Це здатність функції під час створення запам’ятовувати посилання на змінні, функції та параметри, що знаходяться в поточному лексичному оточенні, а також у лексичному оточенні батьківської функції й так до глобального лексичного оточення.

Замикання передбачає саме зовнішні змінні, а не саму функцію.

23
Q
  1. Для чого використовують замикання?
A

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

24
Q
  1. Що таке IIFE?
A

Immediately Invoked Function Expression - це функція, яка викликається або виконується одразу після створення або оголошення.

25
Q
  1. Що таке this?
A

Це посилання на контекст виклику функції. Контекстом є об’єкт, який в цей момент виконує або викликає функцію. Для стрілочної функції — це об’єкт у якому вона створена, а у звичайній функції — яким вона викликана.

Контекстом може бути:

1 - this в об’єкті — вказує на сам об’єкт
2 - this в класі — вказує на екземпляр класу
3 - глобальним контекстом є window (або undefined в режимі use strict).

26
Q
  1. Як можна підмінити контекст виклику функції?
A

Є 3 методи: call, apply, bind. call та apply викликають функцію із заданим контекстом. bind повертає нову функцію із вже назавжди прив’язаним контекстом.

27
Q
  1. Чи можна змінити контекст функції, яку повернув метод bind?
A

Ні, bind прив’язує контекст назавжди.

28
Q
  1. Чи можна підмінити контекст виклику стрілочної функції?
A

Ні. Стрілочна функція не має методів call, apply, bind і своїх аналогів. Також вона використовує контекст у якому її створили, а не контекст у якому її викликали.

29
Q
  1. Що таке прототип об’єкта?
A

Це шаблон об’єкта. Він використовується як запасний варіант для властивостей та методів, що існують у цьому об’єкті. Це також один зі способів обміну властивостями та функціональністю між об’єктами. Це основна концепція прототипного наслідування в JS.

30
Q
  1. Як працює прототипне наслідування в JavaScript?
A

Коли ми хочемо прочитати властивість з об’єкта, а вона відсутня - JavaScript спробує прочитати його з прототипу об’єкта.

Якщо властивості немає в прототипі, JavaScript намагатиметься його прочитати з прототипу прототипу, і т.д. доки властивість не буде знайдено або ланцюжок прототипів не закінчиться. У такому разі JavaScript поверне undefined.

31
Q
  1. Як створити об’єкт у якому не буде прототипу?
A

Використати Object.create(). Цей метод приймає першим аргументом об’єкт, який буде прототипом об’єкта, який він поверне. Якщо ми викличемо Object.create() з аргументом null, буде створено об’єкт без прототипу.

32
Q
  1. Як перевірити чи є властивість об’єкта особистою властивістю або це властивість прототипу?
A

Можна використовувати метод hasOwnProperty, який повертає true або false, в залежності від того, чи містить об’єкт зазначену властивість, як власну властивість, чи ні.

33
Q
  1. Як заборонити змінювати об’єкт?
A

1 - Є метод Object.freeze(), який ““заморожує”” об’єкт від змін. Цей метод працює тільки в один бік. Скасувати дію цього методу вже неможливо.

2 - Є метод Object.seal(), який забороняє додавати нові властивості, але вже наявні властивості можна змінювати.

3 - Також є метод Object.preventExtensions(), який забороняє додавати нові властивості в об’єкт.

34
Q
  1. Що таке дескриптори властивостей об’єкта?
A

Дескриптор — це об’єкт конфігурації властивості в об’єкті.

Він має 4 властивості:
- value - значення властивості об’єкта,
- writable - вказує чи можна змінювати значення цієї властивості,
- enumerable - вказує чи буде видно властивість під час перебору властивостей об’єкта,
- configurable - вказує чи можна додавати або видаляти властивості об’єкта, а також чи можна змінювати дескриптори його властивостей.

35
Q
  1. Чим відрізняється функція конструктор та клас?
A

Клас — це синтаксичний цукор над функцією конструктора. Під час створення екземпляра класу, методи описані в ньому потрапляють у прототип, а методи описані всередині функції конструктора потраплять у сам екземпляр. Для того, щоб методи, описані всередині функції конструктора, потрапили в прототип, їх потрібно окремо туди додати.

36
Q
  1. Що потрібно зробити, щоб метод класу потрапив до його екземпляра?
A

Такий метод слід описати всередині конструктора.

37
Q
  1. Чи є в JavaScript множинне наслідування?
A

Ні, тому що наслідування в JavaScript базується на прототипах, а в одного об’єкта може бути лише один прототип.

38
Q
  1. Що таке Promise?
A

Це об’єкт, який використовують для відкладених та асинхронних обчислень.

Promise має 3 стани:
- очікування (pending): початковий стан, не виконаний та не відхилений.
- виконано (fulfilled): операцію завершено успішно.
- відхилено (rejected): операцію завершено з помилкою.

39
Q
  1. Для чого потрібен метод Promise.all?
A

Очікує виконання всіх промісів або відхилення будь-якого з них.

Повертає проміс, який виконається після виконання всіх промісів. У випадку, якщо будь-який з промісів буде відхилено, Promise.all також буде відхилено.

У нього є аналог Promise.allSetled, який виконується як тільки всі отримані проміси завершені (виконані або відхилені), що містить масив результатів виконання отриманих промісів.

40
Q
  1. Для чого потрібен метод Promise.race?
A

Очікує виконання або відхилення будь-якого з отриманих промісів. Повертає проміс, який буде виконано або відхилено з результатом виконання першого виконаного або відхиленого промісу.

41
Q
  1. Для чого потрібна async/await функція?
A

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

42
Q
  1. Як обробляти помилки в async/await функції?
A

1 - Для цього можна використовувати конструкцію try…catch()
2 - викликати метод .catch() після виклику функції.

43
Q
  1. Що таке event loop?
A

Це механізм, який відповідає за виконання коду, збору та обробки подій та виконання підзадач із черги.

У концепції event loop є кілька блоків:

  • call stack - відповідає за створення контексту виконання функції. Кожна функція, що викликається, потрапляє в call stack.
  • heap - це велика не структурована область пам’яті, в якій зберігаються оголошені змінні, функції тощо.
  • third party API - API, які надає оточення. Наприклад, метод fetch, який надається браузером.
  • queue - список завдань, що підлягають обробці. Кожне завдання асоціюється з деякою функцією, яка буде викликана, щоб опрацювати це завдання.