Існує 8 типів даних. 7 примітивних та 1 складний тип даних.
Примітивні типи: number, string, boolean, symbol, bigInt, null, undefined.
Складний тип - object. Він використовується для колекцій даних та для оголошення більш складних сутностей. Також він передається за посиланням, а прості типи даних за значенням.
NaN (not a number) - це значення, що отримується в результаті виконання числової операції над не числовим значенням. Його тип даних number. NaN не дорівнює самому собі.
Перевірку на NaN можна зробити за допомогою Number.isNaN
undefined (невизначений) являє собою значення за замовчуванням:
1 - змінної, яку оголосили без ініціалізації;
2 - функції, яка нічого не повертає явно;
3 - неіснуючої властивості об’єкта. null - це значення «відсутності значення».
Присвоюється змінній явно.
Строга рівність порівнює значення за типом даних та значенням. Нестроге приводить значення до одного типу, а потім ці значення порівнює.
Тому що об’єкти - це типи даних, що передаються за посиланням. 2 однакові на вигляд об’єкта мають різні посилання, і тому операція порівняння повертатиме false.
1 - використовувати JSON.stringify для приведення об’єктів у рядок та порівняти їх вже як 2 рядки. Такий підхід має обмеження. Якщо в об’єкті будуть методи або symbol - JSON.stringify не зможе конвертувати їх у рядок.
2 - написати або використати з бібліотеки функцію deepEqual, яка буде проходити циклом по ключах двох об’єктів і перевірятиме значення цих ключів. Функція має працювати рекурсивно.
Існує поняття глибокого та поверхневого копіювання. Глибоке - це копіювання об’єкта та всіх його рівнів вкладеності. Поверхневе - це копіювання лише першого рівня вкладеності, а для решти копіюється посилання.
Способи поверхневого копіювання:
1 - використовувати spread оператор (…)
2 - використовувати Object.assign()
Способи глибокого копіювання:
1 - використовувати JSON.stringify - JSON.parse для конвертування об’єкта в рядок і потім назад. Має обмеження щодо копіювання методів та symbols
2 - написати або використати з бібліотеки функцію deepClone яка буде рекурсивно проходитиме за ключами об’єкта та копіюватиме їх у новий об’єкт.
var - змінну можна ініціалізувати після оголошення, можна змінювати, має функціональну область видимості, має hoisting. Зараз майже не використовують під час написання нового коду.
let - змінну можна ініціалізувати після оголошення, можна змінювати, має блокову область видимості, не має hoisting.
const - змінну обов’язково потрібно ініціалізувати під час оголошення, не можна змінювати, має блокову область видимості, не має hoisting.
Для цього можна використати метод Array.isArray.
Є такі методи:
1 - Можна використовувати метод concat().
2 - Можна використовувати spread оператор та об’єднати ці масиви в один загальний масив.
1 - Використати метод includes, який повертає true якщо елемент знаходиться у масиві.
2 - Використати метод indexOf, який повертає індекс знайденого елемента в масиві або -1 якщо елемента в масиві немає.
3 - також можна використати метод find, який повертає знайдений елемент, або повертає undefined.
Це механізм у JavaScript, в якому змінні та оголошення функцій, пересуваються вгору своєї області видимості перед тим, як код буде виконаний. Піднімаються змінні типу var та function declaration.
Значенням змінної буде undefined.
Буде помилка типу ReferenceError. Змінної ще не існує
Це місце, де (або звідки) ми маємо доступ до змінних або функцій. JS має 4 типи областей видимості: глобальна, функціональна, блокова (ES6) та область видимості eval.
Function Expression створюється, коли виконання доходить до нього, а потім вже може використовуватися.
Function Declaration можна використовувати у всьому скрипті (або блоці коду, якщо функцію оголошено в блоці).
1 - Стрілочна функція не має власного this. Вона бере його за місцем створення. У звичайній функції this визначається під час виклику.
2 - Стрілочна функція не має arguments.
3 - Стрілочна функція не має prototype.
4 - Стрілочна функція має короткий синтаксис неявного повернення значення.
Аналога немає. Але можна використовувати rest оператор (…) для того, щоб зібрати всі параметри з якими викликана функція в масив.
Це властивості внутрішнього об’єкта функції, які створюються під час її виклику. Туди записуються аргументи, функції та змінні. Також там знаходиться посилання на зовнішнє лексичне оточення.
У несуворому режимі це window. У суворому - undefined.
Це здатність функції під час створення запам’ятовувати посилання на змінні, функції та параметри, що знаходяться в поточному лексичному оточенні, а також у лексичному оточенні батьківської функції й так до глобального лексичного оточення.
Замикання передбачає саме зовнішні змінні, а не саму функцію.
1 - Часто для створення приватних змінних та функцій (інкапсуляція).
2 - Для збереження проміжних параметрів виклику функції (каррування).
Immediately Invoked Function Expression - це функція, яка викликається або виконується одразу після створення або оголошення.