У JavaScript сім примітивних типів і один об'єктний:
| Тип | Приклад |
|---|---|
string |
'Київ' |
number |
42, 3.14, NaN, Infinity |
bigint |
9007199254740993n |
boolean |
true, false |
undefined |
змінна без значення |
null |
«навмисно порожньо» |
symbol |
Symbol('id') |
object |
об'єкти, масиви, функції, дати, Map... |
Примітиви незмінні й передаються за значенням:
let a = 'текст';
let b = a;
b += '!';
a; // 'текст' - зміна b не торкнулася a
const s = 'привіт';
s.toUpperCase(); // повертає НОВИЙ рядок, s не змінився
Об'єкти передаються за посиланням: змінна зберігає не сам об'єкт, а посилання на нього.
const user = { name: 'Оля' };
const same = user;
same.name = 'Іра';
user.name; // 'Іра' - це той самий об'єкт
function rename(obj) { obj.name = 'Петро'; }
rename(user); // змінює оригінал
Порівняння теж відрізняється: примітиви порівнюються за значенням, об'єкти - за посиланням:
'a' === 'a'; // true
{} === {}; // false - два різні об'єкти
[1, 2] === [1, 2]; // false
Як у примітива є методи? 'текст'.length працює, бо рушій на мить «загортає» примітив у тимчасовий об'єкт-обгортку (String), викликає метод і викидає обгортку. Створювати обгортки вручну (new String('a')) не варто: new String('a') === 'a' - false, а new Boolean(false) у умові - істинний.
Чому це важливо на практиці:
- зміна об'єкта в одній частині коду видна всюди, де є посилання на нього, - джерело багатьох помилок. Звідси звичка створювати копії (
{ ...user },toSorted()) замість змін на місці; - реактивність Vue і стан React покладаються на це: React порівнює стан за посиланням і не помітить зміни всередині того самого об'єкта;
typeofповертає'object'дляnullі масивів - історична особливість, тому для перевірки масиву єArray.isArray.