جلسه ۳ - انواع داده اولیه در مقابل ارجاعی (Primitive vs. Reference Types)

بخش ۲: انواع داده اولیه در مقابل ارجاعی (Primitive vs. Reference Types)

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

مفاهیم کلیدی:

۱. انواع داده اولیه (Primitive Types):

  • ویژگی: این نوع داده‌ها غیرقابل تغییر (Immutable) هستند. یعنی وقتی ایجاد شدند، خودِ مقدار را نمی‌توان تغییر داد.
  • ذخیره‌سازی: مقدار مستقیماً در خود متغیر ذخیره می‌شود (ذخیره با مقدار - Stored by Value).
  • هنگام کپی‌کردن: یک کپی کامل و مستقل از مقدار اصلی ایجاد می‌شود.
  • انواع: String، Number، Boolean، undefined، null، Symbol، BigInt

مثال کلیدی:

let a = 10;
let b = a; // یک کپی کامل از مقدار "10" در b قرار می‌گیرد.
 
a = 20; // مقدار a تغییر می‌کند.
 
console.log(a); // خروجی: 20
console.log(b); // خروجی: 10 (b تحت تأثیر قرار نمی‌گیرد چون کپی مستقل است)

۲. انواع داده ارجاعی (Reference Types):

  • ویژگی: این نوع داده‌ها قابل تغییر (Mutable) هستند. محتوای آن‌ها (مثلاً propertyهای یک شیء) قابل تغییر است.
  • ذخیره‌سازی: آنچه در متغیر ذخیره می‌شود، یک آدرس حافظه (Reference) است که به محل ذخیره‌سازی واقعی داده در حافظه (Heap) اشاره می‌کند (ذخیره با ارجاع - Stored by Reference).
  • هنگام کپی‌کردن: فقط آدرس حافظه کپی می‌شود، نه خود داده. در نتیجه هر دو متغیر به یک مکان از حافظه اشاره می‌کنند.
  • انواع: Object، Array، Function

مثال کلیدی:

let obj1 = { name: "Ali" };
let obj2 = obj1; // آدرس حافظه obj1 در obj2 کپی می‌شود. هر دو به یک شیء واحد اشاره می‌کنند.
 
obj2.name = "Reza"; // محتوای آن مکان حافظه مشترک تغییر می‌کند.
 
console.log(obj1.name); // خروجی: "Reza" (obj1 نیز تحت تأثیر قرار گرفت!)
console.log(obj2.name); // خروجی: "Reza"

ارزیابی بخش ۲:

سؤال ۱: پیش‌بینی خروجی خروجی قطعه کد زیر چیست و دلیل مفهومی آن را توضیح دهید.

let x = 5;
let y = x;
y = 10;
 
let array1 = [1, 2, 3];
let array2 = array1;
array2.push(4);
 
console.log(x);
console.log(y);
console.log(array1);
console.log(array2);

سؤال ۲: تشخیص نوع داده برای هر یک از متغیرهای زیر، مشخص کنید که آیا هنگام کپی‌کردن، یک کپی مستقل ایجاد می‌شود یا یک ارجاع مشترک به داده اصلی برقرار می‌کند.

الف) let age = 30;
ب) let user = { id: 1, name: "Sara" };
ج) let isActive = true;
د) let scores = [10, 20, 30];