Object Reference

🔹 ۱. اشیاء در جاوااسکریپت با Reference ذخیره می‌شوند

برخلاف مقادیر ساده (Primitive مثل string, number, boolean …) که با value ذخیره می‌شن، آبجکت‌ها (Object, Array, Function) با reference (آدرس در حافظه) نگهداری می‌شن.

یعنی وقتی یک آبجکت رو به متغیر دیگه‌ای نسبت بدی، هر دو متغیر به همون آبجکت در حافظه اشاره می‌کنن.

2️⃣ مثال ساده

const user1 = { name: "Ali" }; const user2 = user1; // فقط reference کپی شد user2.name = "Sara"; console.log(user1.name); // Sara console.log(user2.name); // Sara

👉 چون هر دو به یک reference اشاره می‌کنن، تغییر روی یکی روی اون یکی هم اثر میذاره.

3️⃣ مقایسه Reference

const a = { x: 1 }; const b = { x: 1 }; console.log(a === b); // false (چون دوتا reference متفاوت دارن)

حتی اگر محتوا یکی باشه، تا وقتی reference یکی نباشه، برابر نیستن.

4️⃣ تغییر بدون اثرگذاری روی شیء اصلی (کپی)

برای اینکه یک آبجکت رو مستقل از دیگری کپی کنیم، باید کپی عمیق یا سطحی انجام بدیم.

کپی سطحی (Shallow Copy)

const obj1 = { a: 1, b: 2 }; const obj2 = { ...obj1 }; // با Spread obj2.a = 10; console.log(obj1.a); // 1 (تغییر نکرد)

کپی عمیق (Deep Copy)

اگر شیء تو در تو (nested) باشه، shallow copy کافی نیست:

const obj1 = { a: 1, b: { c: 2 } }; const obj2 = JSON.parse(JSON.stringify(obj1)); // Deep Copy obj2.b.c = 99; console.log(obj1.b.c); // 2 (تغییر نکرد)

5️⃣ Reference در آرایه‌ها

const arr1 = [1, 2, 3]; const arr2 = arr1; arr2.push(4); console.log(arr1); // [1,2,3,4] console.log(arr2); // [1,2,3,4]

👉 چون هر دو آرایه به یک reference اشاره دارن.

📌 خلاصه

  • Primitive types → با مقدار (Value) ذخیره می‌شن.

  • Objects, Arrays, Functions → با آدرس حافظه (Reference) ذخیره می‌شن.

  • نسبت دادن یک object به متغیر جدید = فقط کپی reference.

  • برای داشتن نسخه جدا، باید کپی سطحی یا عمیق انجام بدیم.