
Що відбувається з пам’яттю при створенні змінної в JavaScript?
Тип | Опис | Приклад |
---|---|---|
string | Рядок тексту | "Привіт" , 'JS' |
number | Числа (цілі та десяткові) | 42 , 3.14 , -7 |
bigint | Дуже великі цілі числа | 12345678901234567890n |
boolean | Логічне значення | true , false |
undefined | Значення змінної, якій ще нічого не присвоєно | let x; // x === undefined |
null | Усвідомлене “нічого” | let user = null |
symbol | Унікальний ідентифікатор | Symbol("id") |
Резервування пам’яті для змінних
- Змінні, оголошені через
var
, піднімаються (hoisted) — їм одразу виділяється пам’ять зі значеннямundefined
let
таconst
теж “піднімаються”, але в “мертву зону” (TDZ — Temporal Dead Zone) і не ініціалізуються
Зв’язується ім’я змінної з адресою пам’яті
- Програма знає: є така змінна, і вона зберігається за певною адресою
Коли досягається рядок з присвоєнням, відбувається:
- Оцінюється вираз справа від
=
- Це значення зберігається в пам’яті
- Змінна отримує посилання на це місце в пам’яті
Приклад
jsCopyEditlet name = "Anna";
- На фазі створення:
- Пам’ять резервується для
name
(але без ініціалізації)
- Пам’ять резервується для
- На фазі виконання:
- Значення
"Anna"
розміщується в пулі рядків (якщо його ще не було) - Змінна
name
отримує посилання на адресу, де зберігається"Anna"
- Значення
Примітиви vs Об’єкти
Тип даних | Зберігається | Передається |
---|---|---|
Примітиви (number , string , boolean , null , undefined ) | безпосередньо в памʼяті (stack) | за значенням |
Об’єкти, масиви, функції | в heap (куча), а змінна зберігає посилання на них | за посиланням |
jsCopyEditlet user1 = { name: "Anna" };
let user2 = user1;
user2.name = "Oleh";
console.log(user1.name); // → "Oleh" (бо обидва посилаються на той самий об’єкт)
Що відбувається в пам’яті:
Stack (Стек)
- Локальні змінні
- Примітиви
- Порядок: LIFO (Last In — First Out)
Heap (Куча)
- Об’єкти, функції, масиви
- Довготривале зберігання
- Посилання вказують на об’єкти в heap
Прибирання памʼяті (Garbage Collection)
JavaScript має автоматичний збирач сміття (garbage collector):
- Якщо на значення в памʼяті більше немає посилань → воно видаляється
- Це працює завдяки алгоритму досяжності (reachability)
У JavaScript рядки (strings) — це примітивні типи, і передаються за значенням.
Але при цьому реально зберігаються в памʼяті особливим чином — через String Pool і часто ведуть себе як по посиланню на етапі оптимізації.
Примітив = завжди передається за значенням
jsCopyEditlet a = "Hello";
let b = a;
b = "World";
console.log(a); // "Hello" — не змінюється
Тут a
і b
— це окремі копії значення.
Це передача за значенням → b не впливає на a.
Як браузер працює з памʼяттю?
- Коли ти створюєш рядок
let str = "Hello"
, він зберігається в String Pool (в памʼяті — heap). - Але змінна
str
тримає копію значення, а не посилання на обʼєкт, як це буває з масивами або об’єктами.
🔄 А от обʼєкти передаються за посиланням:
jsCopyEditlet obj1 = { text: "Hi" };
let obj2 = obj1;
obj2.text = "Bye";
console.log(obj1.text); // "Bye"
Тут obj1
і obj2
посилаються на той самий обʼєкт у памʼяті (heap).
Порівняння String vs Object
Тип | Передача | Пояснення |
---|---|---|
string | За значенням | Копіюється значення, не впливає на іншу змінну |
object | За посиланням | Обидві змінні посилаються на одну й ту ж адресу в памʼяті |
Висновок:
Створення змінної — це не просто “написати let x”, а цілий ланцюг дій:
- Резервування пам’яті
- Розміщення значення (stack або heap)
- Призначення посилання або значення
- Автоматичне прибирання, коли значення вже не потрібне