Sobes.tech
Junior

Ինչպե՞ս հասկանում եք, թե ինչ է հղումով փոխանցումը։

sobes.tech AI

Պատասխան AI-ից

JavaScript-ում հիմնական տվյալների տիպերը (ստորագրություններ, թվեր, բուլյան արժեքներ, null, undefined, Symbol, BigInt) փոխանցվում են արժեքով: Դա նշանակում է, որ նշանակման կամ ֆունկցիային փոխանցման ժամանակ, ինքն արժեքը պատճենվում է:

Օբյեկտները (ներառյալ զանգվածները և ֆունկցիաները) փոխանցվում և պատճենվում են հղումով: Իրականում, պատճենվում է ոչ թե օբյեկտը, այլ հղումը հիշողության տարածքին, որտեղ այն պահվում է:

// Արժեքով փոխանցում
let a = 10;
let b = a; // Կատարվում է արժեքի պատճենը 10
b = 20;
console.log(a); // 10, փոփոխությունը 'b'-ում չի ազդում 'a'-ի վրա

// Հղումով փոխանցում
let obj1 = { value: 10 };
let obj2 = obj1; // Կատարվում է հղման պատճենը
obj2.value = 20;
console.log(obj1.value); // 20, փոփոխությունները 'obj2'-ով ազդում են 'obj1'-ի վրա, քանի որ նրանք հղում են նույն օբյեկտին

Երբ օբյեկտը փոխանցվում է ֆունկցիային, ֆունկցիան ստանում է հղման պատճենը: Օբյեկտի հատկությունների փոփոխությունը ներսում, ազդում է սկզբնական օբյեկտի վրա, քանի որ հղումը նույնն է: Սակայն, եթե ներսում ֆունկցիայում նշանակենք նոր օբյեկտ, սկզբնական օբյեկտը կմնա անփոփոխ, քանի որ հղումը ցույց է տալիս այլ հիշողության տարածք:

function modifyObject(obj) {
  obj.newValue = 30; // Փոփոխում է սկզբնական օբյեկտը
}

function assignNewObject(obj) {
  obj = { anotherValue: 40 }; // 'obj'-ը հիմա ցույց է տալիս նոր օբյեկտ
}

let myObject = { initialValue: 10 };
modifyObject(myObject);
console.log(myObject); // { initialValue: 10, newValue: 30 }

let anotherObject = { initialValue: 10 };
assignNewObject(anotherObject);
console.log(anotherObject); // { initialValue: 10 }, սկզբնական օբյեկտը չի փոխվել