ساناز محمودی
ساناز محمودی
خواندن ۱ دقیقه·۴ سال پیش

mutable vs immutable

خب این بار قراره راجع به آبجکت‌ها حرف بزنیم

تو سوالی که طرح کرده بودم دو نکته بود یکی mutable بودن آبجکت‌ها و یکی ام const تعریف کردن متغییرها.

-> اول بریم سراغ const که خب راحت تره. سوالی که ممکنه براتون پیش بیاد اینکه مگه میشه یک مقدار ثابت رو تغییر داد و اگه میشه دیگه چرا اسمشو میذاریم const ؟

من نمی‌دونم چه جوری اینو ترجمه کنم که تمیز دربیاد :))))، برای همین خود جملشو میگم:

in JavaScript, const does NOT define constant value, it defines a constant reference to value.

برای همین شما می‌تونید پراپرتری‌های داخل یک آبجکت رو تغییر بدید ولی نمی‌تونید re-assign کنید. با توجه به گزینه‌ ها، فک کنم اکثریت اینو میدونستید.

-> حالا بریم سراغ بخش اصلی mutable vs immutable بودن داده ها.

اول دو تا فریز میگم که همیشه تو ذهنتون باشه :

<- immutable primitive values

<- mutable object references

حالا بریم یک توضیحی بدم راجع به اون دو کلمه :

immutable data داده های هستند که بعد از اینکه ساخته می‌شوند، قابل تغییر نیستند (تحت یک سری متد یا اپراتور) که خب پرامیتیوها به این صورت هستند.

( امیدوارم بدونید پرامیتیوها چیا هستند، اگر نمیدونید MDN خوب توضیح داده =)) )

با مثال میگم بیشتر متوجه شید:

ik i can use str +=
ik i can use str +=

خب اینجا شاید با توجه به چیزی که گفتم، بگید که مقدار str که تغییر کرده پ چی شد ؟

مقدار str "جاوا" میمونه و وقتی تحت اپراتور جمع کانکت میشه، انگاری یک str جدید تو یک بلاک جدید در حافظه ساخته میشه که مقدارش "جاوااسکریپت"ه و اون بلاک قبلی حافظه به garbage collection میره.

حالا تو مثال بعدی بهتر متوجه میشید.

mutable data داده هایی هستند که بعد از ساخته شدن هم قابل تغییر هستند (تحت یک سری متد یا اپراتور) که خب آبجکت ها و آرایه ها و ... به این صورت هستند.

مثالشم با همون سوال که تو لینکدین بود، میرم جلو و بعد مقایسه میکنم با immutable ها :

تو این مثال، همونطور که می‌بینید من پراپرتی آبجکت دومی رو تغییر دادم، پرارپرتی آبجکت اولی هم تغییر کرد. چرا ؟ چون زمانی که آبجکت اولی رو به آبجکت دومی assign میکنیم با رفرنسش assign میشه و بلاک جدید برای آبجکت دومی در حافظه ساخته نمیشه. به عبارتی آبجکت اولی و دومی هر دو رفرنس یکسان تو حافظه دارند و هر تغییری رو هر کدوم اعمال کنیم، رو دیگری هم اعمال می‌شود.

So (obj1 == obj2 -> true), BUT (str1 == str2 -> false)

نکته : اما اگر دو تا آبجکت داشه باشیم با مقادیر و پراپرتی های یکسان از نظر equality و strict equality یکی نیستند چون رفرنس های متفاوتی در حافظه دارند.

اینم لینک پستم در لینکدین.

پ.ن : من هر آنچه که میفهمم رو به زبون خودمونی مینویسم برای همین ممکنه استفاده برخی اصطلاحات، نادرست باشه خوشحال میشم بهم بگید و امیدوارم تا حدودی خوب تونسته باشم توضیح بدم.


javascriptobjectimmutableconst
Computer Enthusiast
شاید از این پست‌ها خوشتان بیاید