JavaScript Advanced Flashcards
Типи данних в JS
- String;
- Number;
- Symbol;
- Null;
- Boolean;
- Undefined;
7.BigInt; - Object;
На основі object створюються такі дані (структура даних):
1. Arrray;
2. Set;
3. Map;
4. Date;
5. Function;
6. Promise;
7. RegExp;
8. Math;
9. Generators;
Чим відрізняється тип даних від структури
Основна відмінність полягає в тому, що тип даних вказує на сами дані (наприклад, це число чи рядок), в той час як структура даних вказує на організацію цих даних у вигляді колекції чи контейнера. Тобто, тип даних - це властивість даних, а структура даних - це спосіб, яким ці дані організовані та зберігаються.
Які оператори є в JS
- Основні арифметичні оператори:
+ (додавання)
- (віднімання)
* (множення)
/ (ділення)
% (залишок від ділення)
++ (інкремент)
– (декремент) - Оператори порівняння:
== (рівність)
!= (нерівність)
=== (строга рівність)
!== (строга нерівність)
< (менше)
> (більше)
<= (менше або рівне)
>= (більше або рівне) - Логічні оператори:
&& (логічне І)
|| (логічне АБО)
! (логічне заперечення) - Оператори присвоювання:
= (присвоєння)
+= (присвоєння з додаванням)
-= (присвоєння з відніманням)
*= (присвоєння з множенням)
/= (присвоєння з діленням)
%= (присвоєння з взяттям залишку) - Тернарний оператор:
condition ? expression1 : expression2 - Порівняння та операції з об’єктами:
typeof (повертає тип операнду)
instanceof (перевірка на належність об’єкту до певного класу)
in (перевірка, чи є властивість у об’єкта) - Побітові оператори (рідкісні):
& (побітове І)
| (побітове АБО)
^ (побітове виключне АБО)
~ (побітове заперечення)
«_space;(побітовий зсув вліво)
» (побітовий зсув вправо)
»> (беззнаковий побітовий зсув вправо)
8.Інші оператори:
, (оператор коми для виразів)
delete (видалення властивостей об’єкта)
new (створення нового об’єкта)
void (використовується для повернення undefined)
yield (використовується в генераторах)
Що таке Set()
Set в JavaScript - це вбудований тип даних, який представляє собою колекцію унікальних значень. Set не допускає наявності дублікатів у своїй колекції, тобто він зберігає лише унікальні значення. Це дуже корисний інструмент для роботи з унікальними об’єктами або даними.
// Створюємо новий Set
const mySet = new Set();
// Додаємо значення до Set
mySet.add(1);
// Дублікати автоматично відкидаються
mySet.add(1); // Не спрацює, так як 1 вже є у Set
// Перевірка наявності значення в Set
console.log(mySet.has(1)); // Вертає true
console.log(mySet.has(4)); // Вертає false
// Видаляємо значення з Set
mySet.delete(2);
// Перебір усіх значень у Set
mySet.forEach(value => {
console.log(value);
});
// Отримуємо кількість елементів у Set
console.log(mySet.size); // Вертає 2
// Очищаємо Set
mySet.clear();
Set в JavaScript фактично не має індексів, оскільки це не індексований масив. У Set елементи зберігаються без жодного індексу, і ви взагалі не можете звертатися до них за допомогою індексів, як це робиться у масивах.
Видалення в Set визначається значенням елемента, яке ви хочете видалити. Це відбувається за допомогою методу delete(), який приймає саме значення. Немає жодних індексів для видалення елементів з Set.
Set - це об’єкт, і він успадковує властивості та методи від прототипу Object, як і більшість інших об’єктів в JavaScript. АЛЕ МАЄ ВЛАСНИЙ ПРОТОТИП NEW SET().
Важливо зауважити, що Set не успадковує властивості та методи масивів (Array), оскільки це окрема структура даних.
Map в JS
Map в JavaScript - це структура даних, яка дозволяє зберігати пари ключ-значення і надає можливість швидко виконувати операції додавання, видалення та отримання значень за ключем. Map відрізняється від об’єкта (Object), оскільки в об’єкті ключами можуть бути лише рядки або символи, тоді як Map дозволяє використовувати будь-які значення (включаючи об’єкти, функції, примітиви і так далі) в якості ключів.
Основні особливості Map включають:
- Додавання та видалення пар ключ-значення: Ви можете додавати нові пари ключ-значення в Map і видаляти їх за ключем.
- Пошук значення за ключем: Ви можете швидко знаходити значення за ключем.
- Доступ до розміру Map: Ви можете дізнатися, скільки пар ключ-значення зберігається в Map.
- Ітерація через всі пари ключ-значення: Ви можете перебирати всі пари в Map за допомогою циклу for…of.
- Використання різних типів ключів: Ключами в Map можуть бути різні типи даних, включаючи об’єкти та функції.
В Чому різниця між Map та Object
Map
1. Пустий за замоучуванням;
2. Ключем може бути все що завгодно;
3. Можемо отримати size;
4. Оптимізований для чистих операцій;
5. По замовчуванню не має stringify\ parse;
Object
1. Має prototype ключі;
2. Ключами можуть бути string, Symbol;
3. Ручний трекінг розміру;
4. Не оптимізований для чистих операцій;
5. Є stringify / parse
WeakMap()
WeakMap - це спеціальний тип Map в JavaScript, основною перевагою є швидко зберігати дані які квикористовують як кеш.
Часто використовується для кеша!
Ось ще пару прикладів
- Слабкі посилання: Однією з ключових особливостей WeakMap є те, що вона використовує слабкі посилання на ключі. Це означає, що, якщо жоден інший код не посилається на ключ, він може бути автоматично видалений з WeakMap системою сміття (garbage collector). Це зазвичай робить WeakMap корисним для збереження даних, які пов’язані з об’єктами і можуть бути видалені, якщо об’єкт вже не використовується.
- Ключами можуть бути лише об’єкти: У WeakMap ключами можуть бути лише об’єкти (включаючи функції), а не примітивні значення, як у звичайних об’єктів або Map.
- Відсутній метод size та ітерація: WeakMap не надає методу size для отримання кількості пар ключ-значення, і ви не можете ітерувати через всі пари в WeakMap.
- WeakMap часто використовується в ситуаціях, де потрібно зберігати приватні дані для об’єктів, і ці дані повинні автоматично видалятися, коли об’єкт стає недосяжним (наприклад, коли він видаляється з пам’яті). Також, WeakMap використовується в деяких внутрішніх реалізаціях JavaScript для зберігання слабких посилань на DOM-елементи та інші об’єкти.
WeakSet()
Працює так само як і WeakMaр різниця у вигляді зберігаємих даних.
Принципи ООП
- Абстракція;
- Інкапсуляція;
- Успадкування;
- Поліморфізму;
- Абстракція - Цей принцип передбачає виділення важливих характеристик об’єкта та приховання деталей реалізації, щоб спростити взаємодію з об’єктом і зробити код більш зрозумілим та обслуговуваним.
Прикладом абстракції може бути клас “Автомобіль”, який має метод “прискорити”, метод “гальмувати” та властивість “швидкість”. З точки зору користувача цього класу, немає необхідності знати, як саме відбувається прискорення або гальмування в механізмі автомобіля. Важливо лише використовувати публічний інтерфейс для керування автомобілем. - Інкапсуляція - інкапсуляція в ООП полягає в обмеженні доступу до деталей реалізації об’єкта та використанні інтерфейсу для взаємодії з об’єктом.
пример пользователь при добовление товара пользуется публичним методом добавить в карзину, но приватние методи (скритие) расчитивают количество, общую сумму. - Успадкування - дозволяє успадковувати дані та функції іншого класу. Це дозволяє переіспользувать логіку між іншими класами. У нас є класс ноутбук в якому є загальна функціональність (екран, клавіатураб тачпад). Щоб не дублювати код ми можемо створити свій ноутбук (MacBook) успадковавши загальний класс ноутбук.
- Поліморфізму дозволяє в незалежності від типу міняти під конкретний тип методи.
class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
// Перевизначення методу getArea для обчислення площі кола
getArea() {
return Math.PI * this.radius * this.radius;
}
}
class Square extends Shape {
constructor(side) {
super();
this.side = side;
}
// Перевизначення методу getArea для обчислення площі квадрата
getArea() {
return this.side * this.side;
}
}
// Функція, яка приймає будь-яку фігуру і обчислює її площу
function calculateArea(shape) {
return shape.getArea();
}
// Створення об’єктів різних фігур
const circle = new Circle(5);
const square = new Square(4);
console.log(circle.getArea());
console.log(square.getArea());
В чому різниця методів Абстракції та Інкапсуляції
class Automobile {
constructor(make, model) {
this.make = make;
this.model = model;
let speed = 0;
const setSpeed = (newSpeed) => { if (newSpeed >= 0) { speed = newSpeed; } }; this.getSpeed = () => { return speed; }; this.accelerate = (amount) => { setSpeed(speed + amount); console.log( `Автомобіль ${this.make} ${this.model} рухається зі швидкістю ${speed} км/год.` ); }; } } В даному коді:
Інкапсуляція:
Інкапсульоване поле speed - це поле, оголошене змінною let в конструкторі класу. Воно приховане від зовнішнього коду і не має прямого доступу ззовні.
Інкапсульований метод setSpeed - це функція, оголошена змінною const в конструкторі класу. Вона також прихована від зовнішнього коду і використовується для зміни значення поля speed.
Абстракція:
Абстракція представлена методом accelerate, який визначений як публічний метод класу. Він використовує інкапсульований метод setSpeed для зміни швидкості та виводить інформацію про русі автомобіля. Користувач класу може взаємодіяти з автомобілем через цей публічний метод без необхідності знати, як саме внутрішньо реалізовано логіку зміни швидкості.
Таким чином, цей код поєднує в собі інкапсуляцію для приховання деталей реалізації (поле speed та метод setSpeed) і абстракцію для надання публічного інтерфейсу (метод accelerate), який дозволяє користувачам взаємодіяти з об’єктом класу “Automobile” без знання всіх деталей його реалізації.
Види створення класів
Constructor functions - старий підхід;
const User = function(email, password) {
this.email = email;
this.password = password;
}
const user1 = new User(‘a@a.com, ‘123’);
- Створює пустий об’єкт;
- Визивається User функція;
- this = пустому об’єкту;
- Об’єкт звязується з prototype;
- Повертає об’єкт;
ES6 Classes
Object.create()
Які прототипи є в JS
Основні:
- Object.prototype: Прототип для всіх об’єктів JavaScript.
- Function.prototype: Прототип для всіх функцій.
- Array.prototype: Прототип для всіх масивів.
- String.prototype: Прототип для всіх рядків.
- Number.prototype: Прототип для всіх чисел.
- Boolean.prototype: Прототип для всіх булевих значень (true і false).
- Date.prototype: Прототип для всіх дат.
- RegExp.prototype: Прототип для всіх регулярних виразів.
- Error.prototype: Прототип для всіх об’єктів помилок.
Додаткові прототипи:
- Set.prototype: Прототип для всіх об’єктів типу Set.
- Map.prototype: Прототип для всіх об’єктів типу Map.
- Promise.prototype: Прототип для всіх об’єктів типу Promise.
- Symbol.prototype: Прототип для всіх об’єктів типу Symbol.
- Generator.prototype: Прототип для всіх об’єктів генераторів.
- Proxy.prototype: Прототип для всіх об’єктів типу Proxy.
- TypedArray.prototype: Прототип для всіх об’єктів типу TypedArray (наприклад, Int8Array, Uint8Array, тощо).
- ArrayBuffer.prototype: Прототип для всіх об’єктів типу ArrayBuffer.
- DataView.prototype: Прототип для всіх об’єктів типу DataView.
- WeakRef.prototype: Прототип для всіх об’єктів типу WeakRef, які використовуються для створення слабких посилань на інші об’єкти.
- FinalizationRegistry.prototype: Прототип для всіх об’єктів типу FinalizationRegistry, які використовуються для реєстрації колбеків фіналізації після видалення об’єктів.
- Intl.Collator.prototype: Прототип для всіх об’єктів Collator, які використовуються для порівняння рядків залежно від локалізації.
- Intl.DateTimeFormat.prototype: Прототип для всіх об’єктів DateTimeFormat, які використовуються для форматування та локалізації дат та часу.
- Intl.NumberFormat.prototype: Прототип для всіх об’єктів NumberFormat, які використовуються для форматування та локалізації чисел.
- URL.prototype: Прототип для всіх об’єктів URL, які використовуються для роботи з URL-адресами.
- Headers.prototype: Прототип для всіх об’єктів Headers, які використовуються для роботи з HTTP-заголовками.
- Request.prototype: Прототип для всіх об’єктів Request, які представляють HTTP-запити.
- Response.prototype: Прототип для всіх об’єктів Response, які представляють HTTP-відповіді.
Як працює Хеш-таблиця в JS
Хеш-таблиця - це структура даних, яка дозволяє ефективно зберігати та отримувати значення за ключем. В мові JavaScript хеш-таблиці використовуються, наприклад, для реалізації об’єктів та множини Set. Давайте розглянемо, як працює хеш-таблиця в JavaScript:
- Створення хеш-таблиці: Хеш-таблиця зазвичай представлена як масив, в якому значення зберігаються за певними індексами. Індекси генеруються за допомогою хеш-функції.
- Хеш-функція: Хеш-функція приймає ключ (у вигляді рядка або числа) та перетворює його в ціле число (хеш), яке служить індексом в масиві. Головною метою хеш-функції є рівномірний розподіл ключів по індексах, щоб зменшити конфлікти.
- Збереження значень: Значення зберігаються у масиві за обчисленим хешем як ключ. Якщо інший ключ має той самий хеш, відбувається колізія, і потрібні додаткові дії для вирішення конфлікту.
- Розв’язання колізій: Колізія виникає, коли два ключа мають однаковий хеш. Існує декілька способів розв’язання колізій, такі як метод лінійного зондування, метод подвійного хешування, метод відкритого зв’язування тощо. Кожен з цих методів вирішує, куди зберігати значення, якщо індекс вже зайнятий.
- Отримання значень за ключем: При отриманні значення за ключем, ви використовуєте хеш-функцію для знаходження індексу у масиві, а потім отримуєте значення з цього індексу.
- Оновлення та видалення значень: Щоб оновити або видалити значення, ви також використовуєте ключ для знаходження індексу за допомогою хеш-функції, а потім змінюєте або видаляєте значення за індексом.
Ефективність хеш-таблиці: Якщо хеш-функція добре розроблена та гарантує рівномірний розподіл ключів, пошук, вставка та видалення значень в хеш-таблиці можуть бути виконані за сталий час (O(1)). Проте колізії можуть призвести до гіршої ефективності, тому важливо вибрати хорошу хеш-функцію та метод розв’язання колізій для забезпечення оптимальної продуктивності.
Хеш таблиця у Frontend розробці
Кешування даних: Ви можете використовувати хеш-таблиці для кешування даних, щоб зменшити кількість запитів на сервер та зберегти дані локально. Наприклад, ви можете зберігати вже завантажені зображення, результати запитів або інші дані.
- Індексація даних: Якщо вам потрібно швидко знаходити та отримувати доступ до об’єктів за певними ключами, хеш-таблиці допоможуть структурувати ваші дані для ефективного доступу.
Приклад: Під час завантаження сторінки ви завантажуєте та зберігаєте зображення в об’єкті Set, щоб забезпечити унікальність URL-адреси зображення. При спробі завантаження того самого зображення ви перевіряєте його наявність у Set і завантажуєте лише в разі відсутності.
- Збереження стану додатків: Хеш-таблиці можуть бути корисними для зберігання стану додатків, наприклад, для збереження параметрів конфігурації, вибраних параметрів фільтрів або стану віджетів.
Приклад: Ви створюєте віджет фільтрації для списку товарів. Всі обрані параметри фільтра зберігаються в об’єкті для збереження стану і використовуються для фільтрації відображуваних товарів.
- Управління подіями та підписниками: Ви можете використовувати хеш-таблиці для зберігання підписників на події в вашому додатку. Ключами можуть бути ідентифікатори подій, а значеннями - списки підписників.
Приклад: Ви створюєте віджет фільтрації для списку товарів. Всі обрані параметри фільтра зберігаються в об’єкті для збереження стану і використовуються для фільтрації відображуваних товарів.
- Управління даними в компонентах: Якщо ви розробляєте компоненти відомими як “реактивні”, ви можете використовувати хеш-таблиці для відстеження залежностей між даними та компонентами.
Приклад: Ви реалізуєте систему подій для вашого користувацького інтерфейсу. Об’єкт EventEmmitter зберігає список підписників на події і визиває їх під час спрацювання подій, які стосуються взаємодії користувача з додатком.
- Імплементація кеш-пам’яті на клієнті: Хеш-таблиці можуть бути використані для збереження результатів обчислень або обчислених значень для подальшого використання без повторного розрахунку.
Приклад: Ви розробляєте реактивний компонент для відображення даних користувача. Об’єкт Map використовується для відстеження залежностей між даними та відображенням і оновлення компонента при зміні даних.
- Зазвичай для роботи з хеш-таблицями в JavaScript використовують об’єкти (як асоціативні масиви), а також класи Map і Set, які надають більше функціональності та контролю.
Приклад: Ви створюєте графічну бібліотеку, яка обчислює та зберігає інтерпольовані значення для прискорення рендерингу графіки. Значення зберігаються в об’єкті Map, щоб уникнути повторного обчислення
Цикли “for”, “for in”, “for of”
- “for” - Перебирає структури даних в яких є індекс;
- for…of - Перебирає значення об’єкта структури даних по значенню не включаючи успадковані властивості, і може бути використаний для ітерації значень в ітерабельних об’єктах (підходить до масивів, рядків, Set, Map).
- for … in - перебирає імена властивостей об’єкта, включаючи успадковані властивості.