Змінні у JS

Що відбувається з пам’яттю при створенні змінної в 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) і не ініціалізуються

Зв’язується ім’я змінної з адресою пам’яті

  • Програма знає: є така змінна, і вона зберігається за певною адресою

Коли досягається рядок з присвоєнням, відбувається:

  1. Оцінюється вираз справа від =
  2. Це значення зберігається в пам’яті
  3. Змінна отримує посилання на це місце в пам’яті

Приклад

jsCopyEditlet name = "Anna";
  1. На фазі створення:
    • Пам’ять резервується для name (але без ініціалізації)
  2. На фазі виконання:
    • Значення "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”, а цілий ланцюг дій:

  1. Резервування пам’яті
  2. Розміщення значення (stack або heap)
  3. Призначення посилання або значення
  4. Автоматичне прибирання, коли значення вже не потрібне