Array Reference

در جاوااسکریپت، آرایه‌ها (Arrays) نوعی Object هستند و وقتی یک آرایه رو به یک متغیر دیگه اختصاص می‌دی، در واقع Reference (مرجع) اون آرایه کپی میشه، نه مقدارش.

این یعنی هر تغییری روی یکی انجام بدی، روی دیگری هم تأثیر می‌گذاره.

1️⃣ اختصاص دادن یک آرایه به متغیر جدید

let arr1 = ["A", "B", "C"]; let arr2 = arr1; // arr2 فقط یک رفرنس به arr1 هست arr2[0] = "Z"; console.log(arr1); // ["Z", "B", "C"] console.log(arr2); // ["Z", "B", "C"]

📌 تغییر در arr2 باعث تغییر در arr1 هم شد، چون هر دو به یک آرایه در حافظه اشاره می‌کنند.

2️⃣ مقایسه‌ی آرایه‌ها

دو آرایه‌ی متفاوت حتی اگر محتویات یکسانی داشته باشن، برابر نیستند چون آدرس (Reference) متفاوتی دارند.

let arr1 = ["A", "B", "C"]; let arr2 = ["A", "B", "C"]; console.log(arr1 == arr2); // false console.log(arr1 === arr2); // false

📌 فقط وقتی یکسان هستن که دقیقاً همان مرجع رو اشاره کنن:

let arr1 = ["A", "B"]; let arr2 = arr1; console.log(arr1 == arr2); // true console.log(arr1 === arr2); // true

3️⃣ کپی کردن آرایه بدون رفرنس (Shallow Copy)

اگه بخوای یک آرایه رو کپی کنی بدون اینکه مرجع مشترک باشه، می‌تونی از روش‌های زیر استفاده کنی:

🔹 با slice()

let arr1 = ["A", "B", "C"]; let arr2 = arr1.slice(); arr2[0] = "Z"; console.log(arr1); // ["A", "B", "C"] console.log(arr2); // ["Z", "B", "C"]

🔹 با spread operator (...)

let arr1 = ["A", "B", "C"]; let arr2 = [...arr1]; arr2[1] = "X"; console.log(arr1); // ["A", "B", "C"] console.log(arr2); // ["A", "X", "C"]

🔹 با Array.from()

let arr1 = ["A", "B", "C"]; let arr2 = Array.from(arr1); arr2[2] = "Y"; console.log(arr1); // ["A", "B", "C"] console.log(arr2); // ["A", "B", "Y"]

4️⃣ نکته مهم (Shallow Copy vs Deep Copy)

  • روش‌های بالا (slice, spread, Array.from) فقط کپی سطحی (Shallow Copy) می‌سازن.

  • یعنی اگر آرایه شامل آبجکت یا آرایه‌های تو در تو باشه، همچنان Reference مشترک خواهند داشت.

let arr1 = [{name: "Ali"}, {name: "Sara"}]; let arr2 = [...arr1]; arr2[0].name = "Reza"; console.log(arr1[0].name); // "Reza" console.log(arr2[0].name); // "Reza"

📌 اینجا تغییر روی یکی باعث تغییر در دیگری شد چون فقط سطح بیرونی کپی شده.

برای کپی عمیق (Deep Copy) می‌تونی از structuredClone() یا JSON.parse(JSON.stringify()) استفاده کنی.

let arr1 = [{name: "Ali"}, {name: "Sara"}]; let arr2 = structuredClone(arr1); arr2[0].name = "Reza"; console.log(arr1[0].name); // "Ali" console.log(arr2[0].name); // "Reza"

✅ جمع‌بندی

  • آرایه‌ها در جاوااسکریپت Reference Type هستند.

  • اختصاص آرایه به متغیر جدید → فقط مرجع کپی می‌شود، نه مقدار.

  • برای جلوگیری از تغییرات ناخواسته باید کپی بسازی (slice, spread, Array.from).

  • برای آرایه‌های تو در تو → نیاز به Deep Copy داری.