تفاوت دیتا‌تایپ های refrence و primitive

تفاوت دیتا‌تایپ های refrence و primitive

در این اموزش قصد داریم با دو نوع مختلف از دیتاتایپ ها و تفاوت انهادر جاوااسکریپت اشنا شویم.

متغیر های primitive و refrence

به طور کلی متغیر ها در زبان جاوااسکریپت دردودسته کلی متغیر های primitive  و متغیر های refrence  جای میگیرند .

متغیرهای primitive :

number , string , bolean , undefine, null, symbol,BigInt

متغیر های refrence :

objects  (ارایه ها و فانکشن ها زیرمجموعه ی ابجکت به حساب می ایند )

تفاوت دیتاتایپ primitive و refrence

۱-نحوه ذخیره سازی داده

هنگام تعریف یک متغیر در جاوا اسکریپت ، موتور جاوااسکریپت با توجه به نوع داده اختصاص داده شده به متغیر، مکانی از حافظه را با ساختار داده هیپ (heap) یا پشته(stack) به آن اختصاص میدهد.

حافظه پشته (stack) نوعی از حافظه است که سرعت دسترسی بالایی اما فضای محدودی دارد; بنابراین نمی‌تواند دیتای زیادی را در خود ذخیره کند و درصورت وارد شدن دیتای بیش از حد ظرفیت سرریزمیشود (stack over flow) به همین دلیل، این نوع حافظه مناسب دیتا تایپ‌های primitive است. چون برخلاف  آبجکت‌ها ، آرایه‌ها و فانکشن‌ها، primitiveها حجم زیادی ندارند و اندازه آنها ثابت است.

برعکس متغیرهای primitive متغیرهای refrence  اندازه ثابتی ندارند و امکان دارد در زمان کامپایل اندازه آن عوض شود ; بنابراین جاوااسکریپت آبجکت ها را درون هیپ(heap) ذخیره می کند. ابتدا موتور جاوااسکریپت یک حافظه ثابت داخل پشته برای آن متغیرایجاد کرده و آدرس حافظه قرارگیری دیتا را در آن ذخیره می کند و دیتای اصلی را درون هیپ نگهداری می کند در آینده هر زمان که به حافظه بیشتری نیاز پیدا شد درون هیپ به آن اختصاص دهد.

همانطور که در تصویر زیر می بینید  برای متغیر name  و age  که از نوع primitive  هستند یک خانه در پشته در نظر گرفته شده و کل متغیر و دیتای آن داخل این خانه ذخیره شده است و برای متغیر person  که از نوع refrence  است ، آدرس نگهداری دیتای آن درون پشته ذخیره شده و خود دیتا درون هیپ وجود دارد.

۲-کپی کردن متغیر

هنگامی که یک متغیر primitive  را درون متغیر دیگری کپی میکنیم یک کپی از دیتای آن داخل متغیر دوم ذخیره میگردد و متغیر دوم به صورت کاملاً مستقل از متغیر اول عمل میکند به صورتی که با عوض کردن مقدار متغیر دوم تغییری در مقدار متغیر اول ایجاد نمیشود (و برعکس). همانگونه که در تصویر زیر میبینید متغیرname1  با مدار اولیه “shima”  مقداردهی شده است . یک کپی از name1 داخل متغیرname2  میریزیم و سپس مقدار name1 را به “Zahra”  تغییر میدهیم .

همانظور که مشاهده میکنید در انتها درون متغیر name1 مقدار “Zahra” و در متغیر name2 مقدار “shima”  وجود دارد .

اما این موضوع در مواجهه با متغیر های refrence  متفاوت است ، بدین صورت که هنگام کپی کردن یک متغیر refrence درون یک متغیر دیگر تنها ادرس حافظه ای که دیتای متغیر اول قرار دارد (همان چیزی که در پشته ذخیره شده است) داخل متغیر دوم کپی میشود و این متغیر به همان دیتای متغیر اول اشاره میکند ; بنابراین با تغییر مقادیر دیتای هرکدام از متغیرها دیتای متغیر دیگر هم عوض میشود.

همان طور که در مثال زیر میبینید ابجکت person  داخل newperson کپی شده است و ادرس حافطه دیتای person  در newperson کپی شده است و هر دو به یک مکان حافظه اشاره دارند.سپس name را در متغیر newperson به “shima” تغییر دادیم همانظور که میبینید چون هردو ابجکت به یک ادرس اشاره دارند مقادیر هر دو عوض میشود.

۳-مقایسه ی دو متغیر

در هنگام مقایسه دو متغیر primitive ، مقدار دیتای انها با هم مقایسه میگردد و درصورت یکی بودن true  را برمیگرداند اما دو متغیر refrence هنگام مقایسه ادرس انها که در پشته ذخیره شده است با هم مقایسه میگردد. به عبارت دیگر حتی دو ارایه یا دو ابجکت با مقادیر کاملا یکسان با یکدیگر برابر نیستند چون دو ادرس حافظه متفاوت دارند. در مثال زیر میبینید که دو ابجکت person و newperson با هم برابرند چون ادرس حافظه انها با هم برابر است ; اما ابجکت person و person1 حتی با اینکه مقادیر یکسانی دارند یکی نیستند چراکه ادرس حافظه انها با هم یکی نیست و هر یک به ادرس اختصاصی خودش اشاره دارد.

امیدواریم از این مقاله نهایت استفاده را برده باشید و آن را با دوستانتان به اشتراک بگذارید. تیم تولید محتوای مدرسه اینترنتی پرنیان این مقاله را تهیه کرده است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *