Array Reference
در جاوااسکریپت، آرایهها (Arrays) نوعی Object هستند و وقتی یک آرایه رو به یک متغیر دیگه اختصاص میدی، در واقع Reference (مرجع) اون آرایه کپی میشه، نه مقدارش.
این یعنی هر تغییری روی یکی انجام بدی، روی دیگری هم تأثیر میگذاره.
1️⃣ اختصاص دادن یک آرایه به متغیر جدید
📌 تغییر در arr2
باعث تغییر در arr1
هم شد، چون هر دو به یک آرایه در حافظه اشاره میکنند.
2️⃣ مقایسهی آرایهها
دو آرایهی متفاوت حتی اگر محتویات یکسانی داشته باشن، برابر نیستند چون آدرس (Reference) متفاوتی دارند.
📌 فقط وقتی یکسان هستن که دقیقاً همان مرجع رو اشاره کنن:
3️⃣ کپی کردن آرایه بدون رفرنس (Shallow Copy)
اگه بخوای یک آرایه رو کپی کنی بدون اینکه مرجع مشترک باشه، میتونی از روشهای زیر استفاده کنی:
🔹 با slice()
🔹 با spread operator (...)
🔹 با Array.from()
4️⃣ نکته مهم (Shallow Copy vs Deep Copy)
-
روشهای بالا (
slice
,spread
,Array.from
) فقط کپی سطحی (Shallow Copy) میسازن. -
یعنی اگر آرایه شامل آبجکت یا آرایههای تو در تو باشه، همچنان Reference مشترک خواهند داشت.
📌 اینجا تغییر روی یکی باعث تغییر در دیگری شد چون فقط سطح بیرونی کپی شده.
برای کپی عمیق (Deep Copy) میتونی از structuredClone()
یا JSON.parse(JSON.stringify())
استفاده کنی.
✅ جمعبندی
-
آرایهها در جاوااسکریپت Reference Type هستند.
-
اختصاص آرایه به متغیر جدید → فقط مرجع کپی میشود، نه مقدار.
-
برای جلوگیری از تغییرات ناخواسته باید کپی بسازی (
slice
,spread
,Array.from
). -
برای آرایههای تو در تو → نیاز به Deep Copy داری.