متغیرها و ثابتها
از متغیرها (و ثابتها) برای ذخیرهسازی دادهها در حافظهی استفاده میشود. فرض کنید برنامهای نوشتهاید که باید طول و عرض مستطیلی را از کاربر دریافت کرده، سپس مساحت را محاسبه کند و به کاربر نمایش دهد. همچنین فرض کنید که روند اجرای برنامه به این شکل است که ابتدا پیغامی به کاربر نمایش داده میشود و از کاربر خواسته میشود تا مقدار طول مستطیل را وارد کند. پس از وارد کردن مقدار طول توسط کاربر، پیغام جدیدی ظاهر شده و مقدار عرض را از کاربر سوال میکند. سپس کاربر مقدار عرض را هم وارد کرده و منتظر میماند تا پاسخ را دریافت کند. شکل زیر یک نمونه از روند اجرای چنین برنامهای را نشان میدهد.
Please enter the length of rectangle :
← 30
Please enter the width of rectangle :
← 20
// User waiting for answer
اکنون زمان پاسخ دادن به کاربر است. میدانیم که مساحت مستطیل را به راحتی میتوان با ضرب کردن مقدار طول در مقدار عرض به دست آورد. اما سوال این است که این مقادیر که پیشتر توسط کاربر وارد شدهاند، در حال حاضر کجا هستند و چطور میتوان به آنها دست یافت. پاسخ این سوال در مفهومی به نام "متغیر (Variable)" نهفته است. برنامه باید مقادیری که از کاربر (یا هر منبع دیگری) دریافت میکند را در محلی از حافظه که ما به آن متغیر میگوییم ذخیره کند.
هر متغیر باید نامی مشخص داشته باشد تا به واسطهی این نام بتوان به آن مراجعه کرد. پیش از این در رابطه با قوانین نامگذاری در جاوا اسکریپت صحبت کردیم. حال باید از این قوانین استفاده کنیم. یعنی نام یک متغیر یک شناسه است که از قوانین نامگذاری شناسهها در جاوا اسکریپت پیروی میکند. مثلاً در مثال فوق میتوانیم دو متغیر با نامهای length و width تعریف کنیم و به ترتیب طول و عرض وارد شده توسط کاربر را در آنها ذخیره کنیم.
تعریف متغیرها و ثابتها
در جاوا اسکریپت برای تعریف یک متغیر میتوان از یکی از کلمات کلیدی var یا let استفاده کرد. در قطعه کد زیر ۳ متغیر با نامهای height، weight و color تعریف شده است.
let weight;
var height;
let color;
حتماً این سوال برای شما پیش آمده است که چه تفاوتی بین کلمات کلیدی let و var وجود دارد؟ و یا اینکه استفاده از کدام کلمهی کلیدی بهتر است؟
در مورد تفاوت دقیق این دو کلمهی کلیدی در فصل ۴ بیشتر صحبت میکنیم. اما فعلاً دانستن این نکته کافی است که کلمهی کلیدی let در استاندارد ES6 به جاوا اسکریپت اضافه شده است و در مجموع برتریهایی نسبت به var دارد. به همین دلیل تا پایان این کتاب تقریباً همیشه از let استفاده خواهیم کرد. اما بعداً با جزئیات بیشتر به این موضوع میپردازیم.
اما در هنگام تعریف هر متغیر، میتوان مقدار اولیهی آن را نیز مشخص کرد. (این مقدار بعداً قابل تغییر است)
let weight = 100;
var height = 80;
let color = 'blue';
همچنین میتوان در یک سطر چند متغیر را تعریف کرده و در صورت نیاز هر یک را مقداردهی کرد. در این صورت باید شناسهها را با کاراکتر کاما "," از هم جدا کنیم. مثلاً در قطعه کد زیر سه متغیر در یک سطر تعریف شده و برای هر کدام، مقدار اولیه نیز در نظر گرفته شده است.
let weight = 100 , height = 80 , color = 'blue';
پس از تعریف متغیرها، در هر نقطهای از برنامه میتوان مقدار جدیدی را به آنها نسبت داد. مثلاً برای مثال محاسبهی مساحت مستطیل میتوان به صورت زیر عمل کرد.
let length = 30 , width = 20 , area;
area = length * width;
با اجرای دستورات فوق، مقدار ۶۰۰ در متغیر area به عنوان مساحت مستطیل ذخیره میشود. که در ادامهی برنامه میتوان از این مقدار برای مقاصد مختلف استفاده کرد. همچنین میتوان مجدداً مقدار دیگری را در این متغیر ذخیره کرد.
اما نوع دیگری از متغیرها نیز در جاوا اسکریپت (و سایر زبانها) وجود دارد که ثابت (Constant) نام دارد. البته اینجا منظور از لفظ "متغیر"، چیزی که قابل تغییر باشد نیست. بلکه منظور همان تعریف اولیه از متغیر است. یعنی محلی برای ذخیرهسازی دادهها در حافظه. حال اگر دادهای که در این محل ذخیره میشود قابل تغییر نباشد، آن را یک ثابت مینامیم.
پس ثابتها هم مانند متغیرها برای ذخیرهسازی دادهها به کار برده میشوند. و دقیقاً مانند متغیرها با استفاده از شناسهها نامگذاری میشوند. تفاوت اصلی ثابت با متغیر در این است که مقداری که در یک ثابت قرار میگیرد قابل تغییر نیست (البته بعداً کمی این تعریف را اصلاح میکنیم).
برای تعریف ثابتها باید از کلمهی کلیدی const استفاده کنیم. توجه کنید که مقدار ثابتها را باید در زمان تعریف مشخص کنیم. چرا که ثابتها را فقط یک بار میتوان مقداردهی کرد و پس از آن دیگر قابل تغییر نیستند. در قطعه کد زیر تعدادی ثابت تعریف و مقدار دهی شده است.
const pi = 3.141;
const e = 2.718 , fib = 1.618;
const newConstant = e * pi; // this is equal to 2.718 * 3.141 = 8.537238
در صورتی که پس از تعریف یک ثابت، قصد تغییر مقدار آن را داشته باشید، برنامه با نمایش پیغامی، شبیه به پیغام زیر متوقف خواهد شد.
const pi = 3.141;
pi = 2.718; // Uncaught TypeError: Assignment to constant variable
حال سوال این است که استفاده از ثابتها بهتر است یا متغیرها؟
آنچه کاملاً مشخص است، این است که همیشه میتوان به جای ثابتها از متغیرها استفاده کرد. ولی عکس آن صادق نیست. چرا که ثابتها را نمیتوان تغییر داد، ولی متغیرها را میتوان ثابت نگاه داشت. یعنی با تغییر ندادن مقدار یک متغیر، عملاً میتوان از آن به عنوان یک ثابت استفاده کرد.
با توضیح فوق احتمالاً اینطور برداشت خواهد شد که در کل نیازی به ثابتها نیست و هر برنامهای را میتوان فقط با متغیرها نوشت. در واقع این ادعای درستی است و بدون استفاده از ثابتها هم میتوان هر برنامهای را نوشت. با این حال چرا ثابتها وجود دارند؟
پاسخ این است که استفاده از ثابتها میتواند خوانایی برنامه را افزایش داده و احتمال وقوع خطاها (خطاهای برنامهنویس) را کاهش دهد. مثلاً فرض کنید در یک برنامه که محاسبات ریاضی انجام میدهد، متغیری به نام pi تعریف کردهایم و مقدار عدد π که تقریباً برابر با ۳.۱۴ است را در آن ذخیره کردهایم. سپس در بخشهای مختلف برنامه از این متغیر برای انجام محاسبات استفاده میکنیم.
حال فرض کنید در محلی از برنامه، برنامهنویس به اشتباه مقدار جدیدی را به این متغیر نسبت دهد (مثلاً ۵.۳). در این صورت برنامه متوجه این اشتباه نخواهد شد و بدون هیچ مشکلی اجرا میشود. اما قطعاً نتایج محاسباتی که بعد از تغییر مقدار pi انجام شدهاند صحیح نیست. اما اگر به جای تعریف متغیر pi، از یک ثابت با همین نام استفاده میکردیم این اشتباه در زمان اجرا مشخص میشد. چرا که جاوا اسکریپت امکان تغییر مقدار یک ثابت را نمیدهد. پس استفاده از یک ثابت در این حالت باعث کشف سریع خطای برنامهنویس میشود. در صورتی که اگر از متغیر استفاده میکردیم، ممکن بود کشف همین خطای ساده کار پیچیدهای باشد.
البته این یک مثال بسیار ساده بود. در برنامههای بزرگ شرایط بسیار پیچیدهتر میشود و بعضاً کشف چنین خطاهایی ممکن است یک روز وقت شما را تلف کند. پس بهتر است مقادیری را که مطمئن هستیم در طول اجرای برنامه تغییر نخواهند کرد به صورت ثابت تعریف کنیم تا از بروز چنین مشکلاتی جلوگیری کنیم.
البته رفتاری که در این بخش در مورد ثابتها تشریح شد، فقط زمانی صادق است که دادهها از انواع اولیه (Primitive Types) باشند. در صورتی که اشیاء (Objects) را به صورت ثابت تعریف کنیم، رفتارشان کمی متفاوت خواهد بود که در فصول بعدی به این موضوع خواهیم پرداخت.