Sobes.tech
Middle

Как работи паметта в JavaScript?

sobes.tech AI

Отговор от AI

Паметта в JavaScript се управлява автоматично. Тя е разделена на две основни области:

  • Heap (Куча): Тук се съхраняват обекти и функции. Паметта се разпределя динамично при създаването на тези същности.
  • Stack (Стек): Тук се съхраняват примитивни стойности (низове, числа, булеви, null, undefined, Symbol, BigInt) и препратки към обекти в кучата. Стекът работи по принципа LIFO (Last-In, First-Out).

Когато препратката към обект вече не се използва, garbage collector (събирач на отпадъци) освобождава паметта в кучата. Алгоритмите за събиране на отпадъци могат да варират, но често се използват маркиране и почистване (Mark and Sweep):

  1. Маркиране: Garbage collector сканира всички достижими обекти от кореновите възли (глобални променливи, локални променливи на текущата функция) и ги маркира като "живи".
  2. Почистване: Всички непомаркирани обекти (недостъпни от кореновите възли) се считат за "мъртви" и се премахват от паметта.

Garbage collector работи на заден план и автоматично. Проблеми с паметта, като течове, възникват, когато обектите остават достижими, въпреки че по логиката на програмата вече не се използват.

Примитивните стойности се копират по стойност, докато обектите и масивите се копират по препратка.

// Пример: примитивна стойност се копира по стойност
let a = 5;
let b = a;
 b = 10;
// a остава 5, b става 10

// Пример: обект се копира по препратка
let obj1 = { value: 10 };
let obj2 = obj1;
obj2.value = 20;
// obj1.value сега също е 20, тъй като obj2 се отнася към същия обект