Middle
Ինչպես է աշխատում հիշողությունը JavaScript-ում?
sobes.tech AI
Պատասխան AI-ից
JavaScript-ում հիշողությունը ավտոմատ կերպով կառավարվում է։ Այն բաժանվում է երկու հիմնական տարածքների՝
- Heap (Հավաքածու): Այստեղ պահվում են օբյեկտները և ֆունկցիաները։ Հիշողությունը դինամիկ կերպով բաժանվում է այս օբյեկտների ստեղծման ժամանակ:
- Stack (Ստեփանակ): Այստեղ պահվում են հիմնական արժեքները (ստրինգներ, թվեր, boolean, null, undefined, Symbol, BigInt) և հղումները heap-ի օբյեկտներին։ Ստեփանակը աշխատում է LIFO (Last-In, First-Out) սկզբունքով:
Երբ օբյեկտի հղումը այլևս չի օգտագործվում, garbage collector-ը ազատում է heap-ի հիշողությունը։ Գործառույթները կարող են տարբեր լինել, բայց հաճախ օգտագործվում է նշում և մաքառում (Mark and Sweep):
- Նշում: Garbage collector-ը սկանավորում է բոլոր հասանելի օբյեկտները ռուչից (գլոբալ փոփոխականներ, ընթացիկ ֆունկցիայի տեղական փոփոխականներ) և նշում է որպես "կենդանի":
- Մաքառում: Բոլոր նշակագրված չլինող օբյեկտները (չհասանելի ռուչից) համարվում են "մահ" և հեռացվում են հիշողությունից:
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 հղում է նույն օբյեկտին