در بسیاری از مواقع، در اپلیکیشن های جاوااسکریپتی باید با اطلاعات سر و کار داشته باشیم. برای مثال دو اپلیکیشن را ببینید:
- فروشگاه آنلاین – اطلاعات شامل کالاهایی است که برای فروش قرار داده شده اند.
- پیامرسان – اطلاعات شامل مخاطبین، پیام ها و چیزهای مرتبط است.
متغیر برای ذخیره سازی و کار با این اطلاعات به کار می رود.
صرفا جهت اطلاع بدانید که در زبان انگلیسی متغیر variable نامیده می شود.
متغیر
متغیر، بخشی نام گذاری شده از حافظهی RAM سیستم است که داده و اطلاعات را در آن ذخیره می کنیم.
برای ایجاد یک متغیر در جاوااسکریپت، از کلیدواژه ی let
استفاده می کنیم.
عبارت زیر متغیری به نام message ایجاد می کند (از این به بعد میگوییم «متغیّر را تعریف میکند») :
let message;
حالا با استفاده از عملگر =
(در ادامه در مورد عملگرها بحث خواهیم کرد) میتوانیم مقادیر و اطلاعات دلخواه را درون این متغیر بریزیم:
let message;
message = 'مجید';
// در خط بالا رشته ی مجید را درون متغیر می ریزیم
رشته ی 'مجید'
درون بخشی از حافظه ی کامپیوتر که با متغیر message
مرتبط است ذخیره میشود. حالا ما با استفاده از اسم متغیر می توانیم به اطلاعات درون آن دسترسی پیدا کنیم:
let message;
message = 'مجید';
alert(message);
// خط بالا اطلاعات درون این متغیر را در خروجی نمایش می دهد
برای مختصرنویسی، هر دو عمل تعریف متغیّر و ریختن مقدار درون آن را در یک خط مینویسیم:
let message = 'salam'; // در این خط هم متغیر را تعریف می کنیم و هم مقداری را درونش می ریزیم
alert(message); // salam
همچنین می توان چند متغیر را در یک خط تعریف کرد:
let user = 'مجید', age = 33, message = 'سلام';
با این کار کد ما کوتاه تر نوشته می شود اما این سبک کدنویسی اصلا توصیه نمی شود. جهت آن که کدها خوانایی بهتری داشته باشند، هر متغیر را درون یک خط تعریف و مقدار دهی کنید.
تعریف متغیرها در چند خط کمی طولانی تر است اما خوانایی را بهبود می دهد:
let user = 'مجید';
let age = 33;
let message = 'سلام';
بعضیها وقتی میخواهند چند متغیّر را در چند خط تعریف کنند، به این شکل کد مینویسند:
let user = 'مجید',
age = 33,
message = 'سلام';
…این افراد گاهی اوقات ویرگول را قبل از نام متغیّر میگذارند. به این شکل:
let user = 'مجید'
, age = 33
, message = 'سلام';
از نظر فنی، همه ی این موارد کار مشابهی را انجام می دهند. بنابر انتخاب یکی از روش های بالا شخصیست و به سلیقه ی شما بستگی دارد.
کلیدواژه var
به جای let
در اسکریپت های قدیمی، کلیدواژه ی var
را بسیار زیاد خواهید دید:
var message = 'سلام';
کلیدواژه ی var
شبیه به let
کار میکند. این کلیدواژه نیز برای تعریف متغیّر است، اما به یک روش قدیمی این کار را انجام می دهد.
در کلیدواژه ی let
تغییر محسوس و مهمی نسبت به var
رخ داده است، اما فعلا در اینجا برای ما اهمیت ندارد. این موضوع را در آینده در مقاله ای با عنوان کلیدواژه var
مورد بررسی قرار می هیم.
یک مثال برای درک بهتر
خیلی سادهتر مفهوم متغیر را درک میکنیم اگر تصور کنیم که متغیر جعبهای برای نگهداری داده و اطلاعات است. جعبه ای که یک نام منحصر به فرد روی آن چسبانده اند.
برای نمونه، متغیر message
را بصورت جعبهای در نظر می گیریم که برچسب "message"
روی آن چسبانده شده و مقدار "سلام"
را درونش قرار داده ایم.
می توانیم هر مقداری را که بخواهیم درون این جعبه قرار دهیم.
همچنین هر چند بار که بخواهیم می توانیم محتوای آن را تغییر دهیم.
let message;
message = 'سلام';
message = 'دنیا'; // مقدار را تغییر دادیم
alert(message);
هنگامی که مقدار جعبه تغییر کرد، مقدار قدیمی از جعبه حذف می شود.
می توانیم دو متغیر تعریف کنیم و مقدار یکی را درون دیگری بریزیم:
let hello = 'Hello world!';
let message;
// با خط زیر مقدار درون متغیر سمت راست را درون متغیر سمت چپ می ریزیم
message = hello;
//حالا هر دو متغیر مقدار برابری دارند
alert(hello); // Hello world!
alert(message); // Hello world!
زبان های برنامه نویسی functional
نکته ی جالب در مورد متغیر این است که بعضی از زبان های برنامه نویسی خاص که به آنها زبانهای functional میگویند، مثل زبان Scala و Erlang تغییر مقادیر درون متغیر را ممنوع کرده اند!
در این زبان ها، اولین باری که مقداری درون جعبه ذخیره شد، برای همیشه همانجا باقی خواهد ماند. اگر تصمیم گرفتیم تا مقدار دیگری را درون جعبه قرار دهیم، این زبانها مجبورمان میکنند جعبهی دیگری بسازیم (متغیر دیگری تعریف کنیم). در این زبانها نمیتوانیم متغیر قدیمی را مجددا استفاده کنیم.
اگر چه این ویژگی در ابتدا عجیب به نظر میرسد، اما این زبان ها پتانسیل بسیار بالایی دارند. علاوه بر این، در کارهای پیشرفتهای مثل پردازش موازی این محدودیت برای ما مزایایی به ارمغان می آورد. یادگیری چنین زبانهایی حتی اگر قصد نداریم فعلا استفاده کنیم ذهن را بازتر میکند.
نام گذاری متغیر
دو محدودیت برای نام گذاری متغیر در جاوااسکریپت وجود دارد:
- نام تنها باید از حروف، اعداد و علامت هایی مانند
$
و_
تشکیل شود. - اوّلین کاراکتر نباید عدد باشد.
نمونه ای از عناوین صحیح:
let userName;
let test123;
وقتی نام متغیر از چند کلمه تشکیل میشود، نام گذاری به روش camelCase انجام میشود. به این شکل که کلمات پشت سر هم نوشته می شوند و هر کلمه با حرف بزرگ انگلیسی آغاز می شود، غیر از اوّلین کلمه: مثلاً myVeryLongName
.
نکته ی جالب این است که می توان از علامت $
و _
در نامگذاری متغیر استفاده کرد. این دو علامت مثل حروف الفبای عادی به حساب میآیند و معنی خاصی ندارند.
نامهای زیر صحیح هستند:
let $ = 1; // متغیری را با علامت $ تعریف کرده
let _ = 2; //متغیری را با علامت _ تعریف کرده
alert($ + _); // 3
مثال هایی از نام غیرمجاز برای متغیر:
let 1a; // نباید عنوان با عدد آغاز شود
let my-name; // خط فاصله در عنوان مجاز نیست
بزرگی و کوچکی حروف الفبا مهم است
توجه کنید که دو متغیر majid
و MaJid
بخاطر متفاوت بودن بزرگی و کوچکی بعضی حروفشان دو متغیر متفاوت هستند.
حروف غیر انگلیسی مجاز است، ولی خوب نیست
استفاده از حروف غیر انگلیسی در نامگذاری متغیر مجاز است اما توصیه نمی شود:
let نام = '...';
let پیام = '...';
از نظر فنی در نامگذاری بالا خطایی وجود ندارد اما این یک فرهنگ جهانی است که برنامهنویسان در نامگذاری متغیر از حروف انگلیسی استفاده میکنند. هر چند که پروژهی ما بسیار کوچک باشد اما ممکن است مدت زمان طولانی مورد استفاده قرار بگیرد و سایر برنامه نویسان جهان لازم باشد روزی کدهای ما را بخوانند و متوجه شوند.
نامهای رزرو شده
لیستی داریم از نامهای رزرو شده در جاوااسکریپت. برای نامگذاری متغیّرها نمیتوان از این نامها استفاده کرد. زیرا این نام ها در خود زبان جاوااسکریپت استفاده شده اند.
مثلاً: let
و class
و return
و function
جزء نامهای رزرو شده هستند.
let let = 5;
let return = 5;
//هر دو عنوان بالا غیر مجازند
مقداردهی متغیر بدون use strict
در حالت عادی باید یک متغیر را پیش از استفاده از آن تعریف کنیم. اما در گذشته از نظر فنی ممکن بود که متغیری را ایجاد کنیم و اصلاً از کلیدواژه ی let
استفاده نکنیم. اگر از حالت strict mode
استفاده نکنیم این کار همین حالا هم امکانپذیر است.
num = 5; // متغیر num اگر وجود نداشته باشد ایجاد خواهد شد
alert(num); // 5
نمونه ی پایین باعث بروز خطا در حالت strict mode می شود:
"use strict";
num = 5; // خطا، num تعریف نشده است
ثابت
برای تعریف ثابت (متغیری با محتوای غیرقابل تغییر) که در زبان انگلیسی به آن constant گفته می شود، بجای کلیدواژه ی let
از const
استفاده می کنیم:
const myBirthday = '16.10.1365';
متغیری که با کلیدواژه ی const
تعریف شود ثابت نامیده می شود. این متغیرها قابل تغییر نیستند. تلاش برای تغییر محتوای آنها موجب بروز خطا می شود:
const myBirthday = '18.04.1982';
myBirthday = '01.01.2001'; // خطا، نمی توان محتوای ثابت را تغییر داد
وقتی برنامهنویس مطمئن است که قرار نیست مقدار متغیّری را تغییر دهد، میتواند برای تعریف این متغیر از کلیدواژهی const
استفاده کند. مثلا متغیری که همواره نام کاربر را در خورد نگه می دارد را می توان با const
تعریف کرد.
ثابت با حروف بزرگ
گاهی ثابتهایی برای نگه داری یک سری اطلاعات استفاده می کنیم که این اطلاعات به سختی در ذهن باقی می مانند.
این ثابتها را با حروف بزرگ الفبا نامگذاری میکنیم و اگر نام متغیّر از چند کلمه تشکیل شده بود کلمات را با _
جدا میکنیم.
برای نمونه، بیایید چند عدد ثابتی را که برای نگهداری مقادیر رنگی وب (هگزادسیمال) ایجاد شده اند بررسی کنیم:
const COLOR_RED = "#F00";
const COLOR_GREEN = "#0F0";
const COLOR_BLUE = "#00F";
const COLOR_ORANGE = "#FF7F00";
//زمانیکه نیاز پیدا می کنیم از یک رنگ استفاده کنیم بصورت زیر عمل می کنیم
let color = COLOR_ORANGE;
alert(color); // #FF7F00
مزایای این روش:
- عبارت
COLOR_ORANGE
بسیار راحت تر از مقدارش یعنی#FF7F00
به ذهن سپرده می شود. - این که
#FF7F00
را اشتباه بنویسیم بسیار محتمل تر از این است که عبارتCOLOR_ORANGE
را اشتباه بنویسیم. - زمانی که کد را مطالعه می کنیم، عبارت
COLOR_ORANGE
را به سادگی درک میکنیم و مفهومش را میفهمیم. در حالی که کد#FF7F00
را نه.
چه موقع باید ثابتها را به این شیوه نامگذاری کنیم و چه موقع به شکل عادی نامگذاری کنیم؟ در این باره توضیحاتی ارائه میدهیم.
استفاده از const
یعنی هرگز قرار نیست مقدار تغییر کند. بعضی از ثابتها طوری هستند که حتی قبل از اجرای کد هم مقدار آن ها را می دانیم، مثل مقدار رنگ قرمز که همیشه #F00
است. ولی مقدار بعضی از متغیرهای ثابت در زمان اجرا تعیین می شود. این متغیرها بعد از آن که مقدارشان تعیین شد، دیگر نمی توانند تغییر کنند. برای نمونه:
const pageLoadTime = /* زمانیکه طول می کشد تا صفحه بارگزاری شود */;
مقدار متغیر pageLoadTime
پیش از بارگزاری کامل صفحه مشخص نیست، بنابر این به شکل عادی نامگذاری می شود. اما این متغیر همچنان یک ثابت است زیرا بعد از آن که مقدار آن را تعیین کردیم دیگر نمی تواند تغییر کند.
به عبارت دیگر ثابت هایی که نامشان با حروف بزرگ نوشته می شود فقط برای نگهداری مقادیری استفاده می شوند که سخت به ذهن سپرده می شوند.
متغیرها را درست نامگذاری کنیم
می توان گفت هنگام صحبت از مفهوم متغیر موضوعی مهم تر از نامگذاری صحیح متغیر وجود ندارد.
نام متغیر باید واضح و شفاف باشد و مقداری که درون متغیر قرار دارد را خیلی ساده توضیح دهد.
نام گذاری متغیر از مهمترین و پیچیدهترین مهارت های مربوط به برنامه نویسی است. نگاه مختصری به نام متغیرها می تواند نشان بدهد که کدام کد را فرد مبتدی و کدام را کدنویس حرفهای نوشته است.
در پروژهی واقعی، بیشتر زمان ما را تغییر و توسعهی کدهای موجود میگیرد و کمتر پیش می آید نوشتن کد جدید از صفر وقت زیادی بگیرد. وقتی ما بعد از مدتی بر میگردیم که پروژههای قبلی را تغییراتی بدهیم، پیداکردن متغیرها و اطلاعاتی که خوب نامگذاری شدهاند بسیار راحتتر از سایر اطلاعات است.
لطفا پیش از آن که متغیری را تعریف کنید چند لحظه خوب در مورد نامگذاری آن فکر کنید.
چند قانون خوب
- از نام های قابل فهم برای انسان استفاده کنید مثلاً
userName
وshoppingCart
. - از نامگذاری متغیرها بصورت مخفف و کوتاه شدیداً پرهیز کنید زیرا خوانایی کدهای شما خوانایی کم میشود. مثلاً
a
وb
وc
. - نامها را تا حد ممکن کوتاه و توصیفی بنویسید.
data
وvalue
اصلاً اسمهای خوبی برای نامگذاری متغیّرها نیستند. این نوع نامگذاری هیچ مفهومی را به خوانندهی کد منتقل نمی کند. تنها در صورتی از این سبک اسامی استفاده کنید که بقیه ی کد مشخص کند ما به چه نوع data یا value اشاره می کنیم. - از نامهایی که در تیم برنامه نویسی و میان همکارانتان مورد قبول هستند استفاده کنید. اصطلاحاتی را بین اعضای تیم خود قرارداد کنید، و همیشه از آن اسامی استفاده کنید. مثلاً اگر به کاربری که از سایتتان بازدید می کند
user
میگویید، پس از آن متغیر های مرتبط را به شکلcurrentUser
وnewUser
نامگذاری کنید، نهcurrentVisitor
وnewManInTown
.
قوانین بالا ساده به نظر میرسد. امّا در عمل ایجاد متغیرهایی با نام مختصر و توصیفی چندان هم ساده نیست. تسلّط به این کار نیاز به تمرین و مداومت دارد.
استفادهی مجدد یا متغیر جدید؟
بعضی از برنامه نویسها به جای ایجاد متغیر جدید، از همان متغیری که از قبل وجود داشته است دوباره استفاده می کنند.
در نتیجه متغیّر مثل جعبهای میشود که هر کسی هر چیزی که دلش میخواهد درون آن میاندازد و برچسب روی جعبه را هم عوض نمیکند. حالا داخل جعبه چیست؟ کسی چه میداند؟ مجبوریم برویم جعبه را باز کنیم و مقدار داخلش را نگاه کنیم تا بفهمیم داخل جعبه چیست.
درست است که این افراد با این کار یک ذرّه در وقت صرفهجویی میکنند، ولی باید ده برابر بیشتر از وقتی را که صرفهجویی کردند برای خطایابی کدهایشان بگذارند.
بهتر است در این موارد متغیّر مجزّا بسازید. متغیّر جدید ضرری به شما نمیرساند.
ابزارهایی هستند که حجم کدها را کاهش می دهند. مرورگرهای وب نیز به اندازه ی کافی کد را بهینه می کنند. بنابراین ایجاد متغیر جدید مشکلی ایجاد نمی کند. گاهی ایجاد متغیرهای مختلف برای مقاصد مختلف کد را بهینهتر میکند!
خلاصه
برای نگه داری اطلاعات و انجام کارهایی روی آن لازم است از متغیر استفاده کنیم. تعریف متغیّر با استفاده از کلیدواژه های var
، let
و const
انجام میشود.
let
– روش جدید تعریف متغیّر است.var
– روش قدیمی تعریف متغیّر است. در حالت عادی از این کلیدواژه نباید در کدمان استفاده کنیم. تفاوت هایlet
باvar
در مقاله ای جداگانه بررسی خواهد شد.const
– همانندlet
است اما مقدارش هرگز نمی تواند تغییر کند.
متغیر باید جوری نامگذاری شود تا به سادگی بتوانیم به محتوای درون آن پی ببریم.