مقدمه

در هر زبان برنامه‌نویسی از متغیرها برای نگهداری مقادیر استفاده می‌شود و به عبارت دیگر، یک متغیر نامی است که به محلی از حافظه داده می‌شود. طبیعتاً این موضوع در مورد جاوااسکریپت نیز صادق است و متغیرهای این زبان حکم ظرف‌هایی برای نگهداری مقادیر داده‌ای مختلف را دارند. در جاوااسکریپت از کلمات کلیدی let و const برای تعریف متغیرها استفاده می‌شود. البته let از ES5 به این استاندارد اضافه شده و تا قبل از آن، از کلمه کلیدی var استفاده می‌شد که هنوز هم قابل استفاده است اما به دلایلی که بعداً خواهید دید، استفاده از let انتخاب منطقی‌تری است. بر خلاف var و let، متغیرهایی که با استفاده از const تعریف شوند، امکان تغییر مقدار را ندارند و به نوعی برای تعریف ثابت‌ها از const استفاده می‌شود.

تعریف متغیر

برای تعریف یک متغیر در جاوااسکریپت از کلمه کلیدی let استفاده می‌شود. ویرایشگرتان را باز کنید، یک فایل با نام variables.js ایجاد کنید و کد زیر را در آن وارد کنید.

Copy Icon variables.js
let message;
message = "Hello";

در اینجا متغیری با نام message تعریف شده و در ادامه، مقدار رشته‌ای Hello به این متغیر اختصاص داده شده است. به این ترتیب، مقدار رشته‌ای Hello در حافظه ذخیره شده و می‌توانیم با استفاده از نام متغیر به آن دسترسی داشته باشیم.

Copy Icon variables.js
let message;
message = "Hello";
console.log(message);  //Hello

برای اجرای این کد، باید دستور node variables.js را در یک محیط ترمینال اجرا کنیم. اگر از یک IDE مثل vscode استفاده می‌کنید که مجهز به ترمینال داخلی است، می‌توانید بدون خروج از محیط IDE این کامند را اجرا کنید و نتیجه را دریافت کنید. برای مثال، در vscode می‌توانید از منوی View گزینه‌ی Terminal را انتخاب کنید تا پنل ترمینال نمایش داده شود. حالا می‌توانید کامند node variables.js را اجرا کنید و نتیجه‌ی آن را ببینید.

$ node variables.js
Hello
          

البته می‌توانیم همانند زیر، تعریف متغیر و تخصیص مقدار به آن را در یک خط انجام دهیم.

Copy Icon variables.js
let message = "Hello";
console.log(message);

به علاوه، امکان تعریف چند متغیر در یک خط نیز وجود دارد که در این صورت، باید متغیرها را با کاما از هم جدا کنیم.

Copy Icon variables.js
let user = "lale", age = 4, message = "Hello";

اگرچه این روش باعث خلاصه‌تر شدن کدها می‌شود اما در عوض، خوانایی کدها را کاهش می‌دهد و بنابراین بهتر است که هر متغیر را در یک خط مجزا تعریف کنیم.

کلمه کلیدی var

در نسخه‌های ابتدایی ES خبری از let نبود و متغیرها با استفاده از کلمه کلیدی var تعریف می‌شدند. جاوااسکریپت مولود جنگ است و همانطور که گفته شد، در یک شرایط اضطراری و درگیر با محدودیت زمانی ساخته شد و از این‌رو ویژگی عجیب‌و‌غریب کم نداشت. از جمله اینکه متغیرهای این زبان (که با var تعریف می‌شدند) Function-scoped بودند نه Block-scoped. این یعنی اینکه متغیرهایی که درون یک بلاک غیر از تابع (مانند یک بلاک شرطی if) تعریف می‌شدند، در بیرون از بلاک نیز در دسترس بودند و این اصلاً منطقی نیست. علاوه بر این، متغیرهای جاوااسکریپت به یک ویژگی بحث‌برانگیز دیگر به نام Hoisting نیز پایبند بودند که بعداً آن را با جزئیات خواهیم دید. با گذر زمان این اشکالات مشخص شد و نیاز به اصلاح آنها حس می‌شد. اما با توجه به اینکه اصلاحات و بهبودها در زبانی مانند جاوااسکریپت باید به‌گونه‌ای باشد که سازگاری با نسخه‌های قبلی یا Backward Compatibility را حفظ کند، امکان حذف این ویژگی‌ها وجود نداشت و در عوض، یک کلمه کلیدی دیگر با نام let در ES5 ارائه شد که این مشکلات را نداشت. با این حساب، بدیهی است که باید برای تعریف متغیر از let استفاده کنیم اما در عین حال، چون امکان مواجهه‌ی ما با کدهای قدیمی‌تر هم وجود دارد، باید با var و ویژگی‌های عجیبش هم آشنا باشیم. در فصل دهم جزئیات مربوط به تفاوت بین let و var ارائه می‌شود.

برای اینکه مفهوم یک متغیر در جاوااسکریپت را به خوبی درک کنید، آن را مانند یک باکس شامل داده در نظر بگیرید که یک برچسب (نام متغیر) روی آن چسبانده شده است. برای مثال، متغیر message در مثال بالا را می‌توانیم مانند باکس زیر تصور کنیم.

Variable Box

ما می‌توانیم هر مقداری را درون باکس قرار دهیم و همچنین، می‌توانیم هر چند بار که بخواهیم، این مقدار را تغییر دهیم.

Copy Icon variables.js
let message;
message = "Hello";
console.log(message); // Hello
message = "World!";
console.log(message); // World!

وقتی مقدار جدیدی را به متغیر اختصاص می‌دهیم، مقدار قبلی حذف می‌شود.

Variable Box Changed

این امکان هم وجود دارد که مقدار یک متغیر را در یک متغیر دیگر کپی کنیم.

Copy Icon variables.js
let hello = "Hello, world!";
let message = hello;
console.log(hello);    // Hello, world!
console.log(message);  // Hello, world!

نامگذاری متغیرها

برای نامگذاری متغیرها در جاوااسکریپت باید دو قانون زیر را رعایت کنیم:

  • نام یک متغیر فقط می‌تواند شامل حروف، اعداد و کاراکترهای $ و _ باشد.
  • نام متغیر نمی‌تواند با یک عدد شروع شود.

علاوه بر این، همانطور که قبلاً هم گفتیم، برنامه‌نویسان جاوااسکریپت معمولاً از استایل قراردادی camelCase برای نامگذاری متغیرهایی که نامشان از بیش از یک کلمه تشکیل شده، استفاده می‌کنند. در این استایل، کلمات به صورت پشت‌سرهم می‌آیند و همه‌ی کلمات به جز اولی، با یک حرف بزرگ شروع می‌شوند. برای مثال، myVeryLongName از این شیوه تبعیت می‌کند.

در ضمن، توجه داشته باشید که نام متغیرها به بزرگی و کوچکی حروف حساس است. بنابراین، apple و Apple دو متغیر متفاوت محسوب می‌شوند. همچنین، اگرچه استفاده از کاراکترهای غیر لاتین (مانند کاراکترهای فارسی) برای متغیرها مجاز است اما بهتر است از این کار اجتناب کنیم.

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

  • از نام‌های بامعنا برای انسان مانند userName و shoppingCart استفاده کنید.
  • از اسامی اختصاری و کوتاه مانند a و b و c استفاده نکنید، مگر اینکه دلیل خوبی برای این کار داشته باشید.
  • نام متغیرها باید توصیف‌کننده‌ی مقدار ذخیره‌شده در آنها باشد. بهتر است که نام‌ها حتی‌الامکان کوتاه‌تر باشند اما اولویت با توصیفی‌بودن نام متغیرهاست. نام‌هایی مانند data و value نام‌های مناسبی نیستند، چون توصیف خاصی از مقدار خود ارائه نمی‌دهند.

تعریف ثابت‌ها با استفاده از const

کلمه کلیدی const برای تعریف متغیرهایی به کار می‌رود که مقدارشان ثابت است. شاید ثابت ماندن مقدار یک متغیر با تصوری که از مفهوم متغیر دارید، سازگار نباشد. اما باید توجه داشته باشید که یک متغیر برنامه‌نویسی با یک متغیر ریاضی تفاوت دارد؛ در برنامه‌نویسی، متغیر مکانیزمی است برای ذخیره‌ی مقادیر در حافظه. حالا فرض کنید در یک برنامه نیاز به ذخیره‌ی مقداری مثل سرعت نور در خلأ داشته باشیم. با توجه به ثابت بودن این مقدار، بهتر است از کلمه کلیدی const برای تعریف چنین متغیری استفاده کنیم.

Copy Icon variables.js
const speedOfLight = 299792458;