درک تغییرپذیری و تخصیص مجدد

سلام، امروز می خواهم در مورد موضوعی صحبت کنم که ممکن است هنگام شروع برنامه نویسی گیج کننده باشد، به خصوص در زبان هایی مانند جاوا اسکریپت که تفاوت بسیار واضح است: تغییرپذیری و تخصیص مجدد.
مانند سایر زبانها، جاوا اسکریپت اجازه میدهد تا متغیرهایی را که در آنها ذخیره میشود، تعریف کند. 3 کلمه رزرو شده وجود دارد که به ما در تعریف متغیرها کمک می کند: var
، let
y const
، اما برای این مقاله، ما بر روی این 2 مورد آخر تمرکز خواهیم کرد و به رابطه آنها با تغییرپذیری و نقشه برداری مجدد خواهیم پرداخت.
-
let
: به شما امکان می دهد متغیری را تعریف کنید که مقدار آن در هر زمان قابل تخصیص مجدد باشد. -
const
: به شما امکان می دهد متغیری را تعریف کنید که مقدار آن قابل تخصیص مجدد نباشد، یعنی یک ثابت.
این تعاریف، اگرچه مختصر هستند، اما ممکن است برای توضیح تأثیر استفاده از یکی در مقابل دیگری در جاوا اسکریپت کافی نباشند، زیرا به نظر من، لازم است ابتدا بر مفاهیم تأکید شود. واگذاری مجدد y تغییرپذیری که مستلزم استفاده از یک یا آن کلمه رزرو شده است.
برای انجام این کار، به نحوه عملکرد حافظه در یک کامپیوتر برمی گردیم: به طور کلی، و با نادیده گرفتن تعدادی از جنبه های اساسی در مورد معماری کامپیوتر، این حافظه RAM است که داده هایی را که قرار است با آن کار کنیم ذخیره می کند. این داده ها دارند آدرس ها که از طریق آن به آنها دسترسی داریم.
بیایید به یک مثال نگاه کنیم: فرض کنید یک حافظه RAM 8 بایتی داریم، بنابراین اگر نیاز به ذخیره 1 بایت داشتیم، میتوانیم این کار را در هر یک از 8 فضای مختلف موجود انجام دهیم. فرض کنیم که این فضاها هستند آدرس های حافظهو آنها را از 0 تا 7 نام می بریم.
وقتی اولین متغیر را در کد خود اعلام می کنیم، فرض کنید x = 5
، کامپیوتر به دنبال فضای حافظه موجود در RAM ما می شود، فرض کنید که در این حالت فضای 0 است و مقدار 5 را در آنجا ذخیره می کند x
قصد دارم به هدف به آدرس حافظه 0، زیرا در RAM ما عدد 5 را ذخیره کرده ایم، اما متغیر خود را x
شامل عدد 5 نیست، بلکه حاوی عدد است آدرس حافظه جایی که عدد 5 در آن قرار دارد.
حافظه رم 8 بایتی، با
x
با اشاره به آدرس 0 و ذخیره عدد 5.
اکنون، ما متغیرهایی داریم که نشاندهنده آدرسهای حافظه و آدرسهای حافظهای که دادهها در آن ذخیره میشوند. این داده ها می توانند اعداد، کاراکترها و زوج باشند اشاره گرها. برای درک این موضوع، اجازه دهید ابتدا مفهوم اشاره گر را تعریف کنیم:
- اشاره گر: داده ای است که حاوی الف است آدرس حافظه از یک واقعیت دیگر، به همین دلیل است که گفته می شود نقطه به آدرس حافظه دیگر
در ادامه مثال خود، می توانیم در آدرس 1 حافظه a ذخیره کنیم اشاره گر به سمت آدرس 2. بنابراین، اگر بخواهیم به داده های واقع در آدرس 2 دسترسی داشته باشیم، ابتدا باید به آدرس 1 دسترسی داشته باشیم که ما را به آدرس 2 می برد.
فرض کنید که در آدرس 2 a فهرست کنید از 4 عنصر (7, 'a', 'c' y 9)
. از آنجایی که دیگر یک داده واحد نیست، ما از فضای حافظه بیشتری استفاده می کنیم: در مجموع 4 بایت، از فضای 2 (ابتدا) تا فضای 5 (انتها). بنابراین، به طور خلاصه، در آدرس 0 RAM ما عدد 5 را داریم، در آدرس 1 ما یک اشاره گر به آدرس 2 و در آدرس 2 لیستی از 4 عنصر خواهیم داشت:
حافظه رم 8 بایتی، با
x
با اشاره به آدرس 0، یک اشاره گر در آدرس 1 که به آدرس 2 اشاره می کند، و 4 عنصر مربوط به لیستی که از آدرس 2 شروع شده و به آدرس 5 ختم می شود.
با در نظر گرفتن این سناریو، بیایید مفاهیم را تعریف کنیم واگذاری مجدد y تغییرپذیری. این واگذاری مجدد زمانی است که می خواهیم مقدار را تغییر دهیم در آدرس حافظه ذخیره می شود که نشان دهنده متغیر ماست. یعنی عملیات x = 10
به آدرس 0 دسترسی پیدا می کند و مقدار ذخیره شده در آنجا را از 5 به 10 تغییر می دهد تخصیص مجدد متغیر a la x
. یا، ما می توانستیم تخصیص مجدد آدرس حافظه 1 به طوری که ذخیره آدرس حافظه 2 را متوقف می کند و از این پس هر عددی را به جای اشاره گر ذخیره می کند.
از سوی دیگر، خواهیم گفت که تغییرپذیری توانایی یک متغیر برای تغییر محتوای آن است بدون تغییر ارزش در آدرس حافظه ای که نشان می دهد ذخیره می شود. به دنبال ایده قبلی، اگر متغیر جدیدی داشته باشیم y
که نشان دهنده آدرس حافظه 1 است (که ما به خاطر می آوریم، یک اشاره گر به آدرس حافظه 2 ذخیره می کند، جایی که یک لیست وجود دارد)، و ما می خواهیم یک عنصر را اصلاح کنید از آن لیست، ما می توانیم بدون تغییر مقدار موجود در آدرس حافظه 1 این کار را انجام دهیم تغییر می کند متغیر y
، از آنجایی که می خواهیم مقداری را در آدرس حافظه دیگری تغییر دهیم. با این حال، اگر اکنون متغیر را بخواهیم y
مقدار 3 را دارد، می شود تخصیص مجدد و نه تغییر می کند.
به طور خلاصه:
- تخصیص مجدد: توانایی یک متغیر برای تغییر مقدار ذخیره شده در آدرس حافظه ای که به آن اشاره می کند.
- تغییر پذیری: توانایی یک متغیر برای تغییر محتویات خود بدون تغییر مقدار آدرس حافظه ای که به آن اشاره می کند.
با درک این موضوع، می توانیم این مفاهیم را به اکوسیستم جاوا اسکریپت بیاوریم، بیایید به مثال زیر نگاه کنیم.
const x = 10;
x = 5; // Uncaught TypeError: Assignment to constant variable.
متغیرهای تعریف شده با const
آنها نمی توانند تخصیص مجدد، بنابراین وقتی مقدار 10 را اختصاص دادیم، هیچ کاری دیگر نمی توانیم برای تغییر آن مقدار انجام دهیم. همین اتفاق در مورد اشیا نیز می افتد:
const x = { nombre: 'Javascript Chile' };
x.url = 'https://jschile.org/'; // Ningún problema.
x = { url: 'localhost' } ; // Uncaught TypeError:
// Assignment to constant variable.
در این صورت یک شی تعریف می کنیم که بعدا جهش یافته اند، اضافه کردن ملک url
، اما وقتی می خواستیم شی دیگری را اختصاص دهیم با خطا مواجه شدیم. این به این دلیل است که وقتی با اشیا کار می کنیم، چیزی که در آدرس حافظه که نشان دهنده متغیر است ذخیره می شود a است اشاره گر، که به آدرس حافظه جایی که شی ذخیره می شود اشاره می کند، و بنابراین تلاش برای ذخیره یک شی دیگر شامل تغییر مقدار ذخیره شده در آدرس حافظه می شود. x
، جایی که اشاره گر را تغییر می دهد و بنابراین تلاش می کند تخصیص مجدد متغیر.
برای اتمام، مثال زیر با وجود دارد let
:
let x = { nombre: 'Javascript Chile' };
x.url = 'https://jschile.org/'; // Ningún problema.
x = { url: 'localhost' } ; // Ningún problema.
جایی که هر دو عملیات کار می کنند زیرا let
هر دو را اجازه می دهد واگذاری مجدد به عنوان تغییرپذیری. با این حال، ارزش مطالعه بیشتر در مورد چگونگی این را دارد تغییرپذیری این بر توسعه محصولات ما و نحوه برنامه ریزی ما تأثیر می گذارد. به عنوان جزئیات، در این مقاله از مفهوم استفاده می کنم واگذاری مجدد، از آنجایی که حافظه های رم همیشه دارای داده هایی هستند که به آنها اختصاص داده شده است، آنها همیشه یک یا 0 را در سلول های خود ذخیره می کنند، بنابراین به نظر من صحبت در مورد آن اشتباه است. وظیفه تحت سطح جزئیاتی که این مقاله در آن توسعه یافته است، اما به این معنی نیست که صحبت از آن به خودی خود اشتباه است. اختصاص دهد یک متغیر
امیدوارم با این مقاله مفهوم به خوبی درک شده باشد و من همچنان به نظراتی که ممکن است داشته باشید، اشاره کنم که این مقاله از یک استخراج شده است مقدمه ای بر یادداشت جاوا اسکریپتکه برای دانشجویان توسعه وب خود نوشتم، می توانید با کلیک بر روی تصویر آن را دانلود کنید:
به امید دیدار!