Data Type مقادیر و محتویاتی است که یک متغیر میتواند در خود ذخیره کرده سپس عملیاتی بر روی آن متغیرها صورت پذیرد (مثلاً عدد 10 در یک جملهٔ فارسی با عدد 10 در یک معادلهٔ ریاضیاتی دو هویت کاملاً مجزا هستند.) زبان برنامهنویسی جاوااسکریپت با تعیین کردن دیتا تایپ (نوع داده) برای هر متغیر، میتواند تفاوت میان مقادیری که باید به عنوان عدد شناخته شده و مقادیری که باید به عنوان حروف شناخته شوند را درک کند (برای آشنایی بیشتر با متغیرها در این زبان، میتوانید به آموزش آشنایی با مفهوم متغیر در زبان برنامهنویسی جاوااسکریپت مراجعه نمایید.)
روی هم رفته، تعداد دیتا تایپها در زبان برنامهنویسی جاوااسکریپت خیلی زیاد نیست به طوری که چیزی در حدود هفت دیتا تایپ اصلی در این زبان وجود دارد (البته در آینده ممکن است انواع جدیدی هم به این لیست افزوده شود. همچنین جالب است بدانید که زبان برنامهنویسی ++C دارای حداقل دوازده دیتا تایپ مختلف است.)
در حقیقت، جاوااسکریپت اصطلاحاً Loosely Typed است. به عبارت دیگر، این زبان برنامهنویسی محبوب به گونهای طراحی شده که شما میتوانید به راحتترین شکل ممکن متغیرهای خود را بسازید چرا که این وظیفه به دوش جاوااسکریپت گذاشته شده تا تایپ متغیر را تشخیص دهد. البته این بدان معنا نیست که جاوااسکریپت نمیتواند میان انواع دیتا تایپها تمایز قائل شود بلکه جاوااسکریپت با تشخیص نوع دادهٔ متغیر در پشت صحنه، این بار را از روی دوش برنامهنویس بر میدارد.
دیتا تایپ عددی
اعداد در جاوااسکریپت به صورت اعداد اعشاری 64 بیتی ذخیره میشوند و این بدان معنا است که جاوااسکریپت میتواند اعدادی بین 5e-324 (یک 5- با 324 صفر جلوی آن) تا 1.7976931348623157e+308 را در خود ذخیره کند. برای جاوااسکریپت فرقی نمیکند که اعداد شما صحیح باشند و یا اعشاری بلکه بر خلاف اکثر زبانهای برنامهنویسی، برای ذخیرهٔ انواع مختلف عددی نیاز به تعریف نوع دادهای جداگانه ندارد. در اکثر زبانها، اعداد صحیح مثبت و منفی که به آنها Integer گفته میشود یا اعداد اعشاری (Float) باید به طور جداگانه تعریف شوند، اما جاوااسکریپت اینگونه نیست.
در پاسخ به این پرسش که «آیا جاوااسکریپت میتواند اعداد خیلی بزرگ را به درستی ذخیره کند؟» یا این سؤال که «بزرگترین عددی که جاوااسکریپت میتواند شناسایی کند چیست؟» میتواند عددی که در ادامه آمده را به عنوان پاسخ در نظر گرفت که با این تفاسیر، جاوااسکریپت میتواند از پس ذخیرهسازی اعدادی که ممکن است در توسعهٔ هر نوع اپلیکیشنی با آنها سروکار داشته باشیم برآید:
179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
به طور کلی، زمانی که یک متغیر عددی را در جاوااسکریپت تعریف میکنیم، باید از تمامی اجزای زیر استفاده کنیم:
- کلمهٔ کلیدی var
- نامی که میخواهیم برای متغیر در نظر بگیریم
- عملگر =
- مقدار که میتواند یک عدد و یا معادلهای که به یک عدد ختم شود باشد
- علامت ;
برای نمونه، عبارات زیر همگی به درستی یک متغیر عددی را تعریف میکنند:
var numberOfCats = 9;
var speedOfPride = 110;
var howManyBiscuits = 6;
- ()Number: یکی از فانکشنهایی که به طور پیشفرض در زبان جاوااسکریپت وجود دارد ()Number
است که به کمک آن میتوان هر مقداری را به یک عدد معادل آن تبدیل کرد. برای این کار، تنها لازم است که مقدار مورد نظر یا متغیری که آن مقدار را در خود ذخیره کرده است را به عنوان پارامتر ورودی این فانکشن پاس دهیم که در این صورت میتواند چند خروجی متفاوت انتظار داشت که عبارتند از:
1. اعدادی که به شکل استرینگ (متن) ذخیره شدهاند به کمک این فانکشن به عدد تبدیل میشوند تا بتوان از آنها در محاسبات استفاده کرد:
Number("42"); //returns the number 42
2. متون و حروفی که نمیتوان آنها را به عدد تبدیل کرد، پس از قرار گرفتن در این فانکشن منجر به ریترن شدن عبارت NaN میشوند که این عبارت مخفف Not A Number است به طوری که داریم:
Number("eggs"); //returns NaN
3. مقدار بولیَن true
خروجی 1 را به ما نمایش میدهد:
Number(true); //returns 1
4- مقدار بولیَن false، خروجی 0 را نمایش خواهد داد:
Number(false); //returns 0
- ()parseInt: جاوااسکریپت تمامی اعداد را به صورت اعداد اعشاری میبیند؛ به عبارتی، حتی اعداد صحیحی مثل 10 برای جاوااسکریپت به شکل 10.00 هستند که رقم پس از اعشار آنها بیتأثیر است. با این حال، ما میتوانیم با استفاده از فانکشن ()parseInt
از جاوااسکریپت بخواهیم که فقط بخش صحیح و غیراعشاری عدد را در نظر گیرد و هرچه بعد از اعشار قرار دارد را حذف کند:
parseInt(100.33); //returns 100
- ()parseFloat: با کمک این فانکشن میتوانیم به جاوااسکریپت بگوییم که یک استرینگ را به صورت اعشاری در نظر بگیرد اگرچه فانکشن ()Number
نیز همین کار را انجام میدهد:
parseFloat("100.33"); //returns 100.33
این فانکشن جاوااسکریپت تشخیص میدهد که آیا اولین کاراکتر استرینگ ورودی یک عدد است یا خیر که اگر عدد بود، استرینگ مد نظر اصطلاحاً پارس میشود تا به پایان عدد برسد و آن عدد را باز میگرداند:
parseFloat("40 years"); //returns 40
توجه داشته باشیم که اگر اولین کاراکتر یک عدد نباشد، خروجی این فانکشن NaN است به طوری که داریم:
parseFloat("I am 20"); //returns NaN
حال با وارد شدن به کنسول جاوااسکریپت مرورگری همچون کروم، میتوانیم متغیرهای زیر را تست کنیم:
1 + 1
3 * 3
parseFloat("839");
parseInt(146.33);
parseInt("33.55555");
12 + "12"
"12" + 12
"11" * 2
با اجرای اسکریپتهای فوق، متوجه میشوید که بعضی از نتایج بالا کمی عجیب به نظر میرسند. برای مثال، وقتی "12" که یک استرینگ است را با عدد 12 جمع میکنیم خروجی "1212" خواهد بود که باز هم یک استرینگ است اما وقتی که استرینگ "12" را در عدد 2 ضرب میکنیم، جواب 24 میشود که یک عدد است!
در تفسیر این رفتار عجیب، باید گفت که در نمونهٔ اول وقتی که عمل جمع را انجام میدهیم، جاوااسکریپت حدس میزند به خاطر آنکه یکی از عبارات استرینگ است، پس منظور دولوپر آن بوده که عبارت دیگر هم به صورت استرینگ با آن جمع شود و از همین روی عبارت دوم که یک عدد صحیح است را به استرینگ تبدیل کرده و عملگر جمع را به عنوان یک عملگر اصطلاحاً Concatenation (الصاق) میشناسد به طوری که این عملگر دو عبارت استرینگ را پشت سر هم به یکدیگر میچسباند و به همین دلیل نتیجهٔ نهایی 1212 خواهد بود اما در نمونهٔ دوم، زمانی که ما عمل ضرب را انجام میدهیم، یکی از اجزای معادلهٔ ما عدد است و از آنجایی که به هیچ وجه نمیتوان استرینگها را با هم ضرب کرد، جاوااسکریپت عبارت استرینگ را به عدد تبدیل کرده سپس عمل ضرب را ادامه میدهد. حال ممکن است این سؤال پیش آید که «اگر زمانی بخواهیم دو استرینگ را در هم ضرب کنیم چه اتفاقی میافتد؟» به طوری که مثلاً خواهیم داشت:
"Sokan" * "Academy"
نتیجه NaN خواهد بود زیرا به هیچ وجه نمیشود Sokan یا Academy را به عدد تبدیل کرد.
دیتا تایپ استرینگ
استرینگ (متن) میتواند شامل هر کاراکتری باشد که از آن جمله میتوان به حروف، اعداد، علامتهای نگارشی مثل کاما و کاراکترهای خاص که برای نوشتن آنها یک \
قبل از آنها گذاشته میشود اشاره کرد. در پاسخ به این سؤال که «منظور از کاراکترهای خاص چیست؟» باید گفت که برخی از کاراکترها مثل کوتیشن دارای معنی خاصی در زبان جاوااسکریپت هستند و برای آنکه بتوانیم از آنها در داخل استرینگها استفاده کنیم، میباید آنها را به شکل خاصی مورد استفاده قرار دهیم که به این کاراکترها Special Characters گفته میشود. جدول زیر، لیست کاراکترهای خاصی که میتوانیم از آنها در داخل استرینگ استفاده کنیم را نشان میدهد:
کد | خروجی |
\' | سینگل کوتیشن |
\" | دابل کوتیشن |
\\ | استفاده از خود کاراکتر \ در داخل متن |
\n | ایجاد خط جدید |
\r | نشانهگر را به ابتدای خط باز میگرداند |
\t | ایجاد فاصله به اندازهٔ یک تَب (معمولاً 4 اِسپیس) |
\b | بَکاسپِیس |
برای ساخت یک متغیر از جنس استرینگ، فقط کافی است که متن خود را در مابین دو علامت '
یا "
قرار دهیم:
var myString = "Hello, I'm a string."
در حقیقت، فرقی نمیکند که استرینگ خود را بین '
قرار دهیم یا "
فقط باید حواسمان باشد که کوتیشنهای ابتدایی و انتهایی از یک نوع باشند. اگر استرینگ مد نظر را در میان '
قرار دهیم، آن وقت میتوانیم درون خود استرینگ از "
استفاده کنیم بدون آن که مشکلی پیش بیاید و برعکس این موضوع نیز صحت دارد به طوری که اگر استرینگ را در میان "
قرار دهیم، در متن خود میتوانیم از '
استفاده کنیم (درست همانند مثال بالا که کل استرینگ در بین "
قرار گرفته و عبارت «I'm» بدون هیچ مشکلی و با استفاده از '
در داخل متن وجود دارد.) اما اگر بخواهیم در یک متن هم از '
و هم از "
استفاده کنیم، باید قوانین این کار را رعایت نماییم.
فرض کنید که استرینگ خود را در میان "
قرار دادهایم و میخواهیم درون متن نیز یک جملهٔ نقلقول با استفاده از همان کوتیشنها بیان کنیم که در چنین شرایطی برای فرار از مشکل خطای جاوااسکریپت، قبل از کوتیشنهای درون متن یک \
میگذاریم تا بدین ترتیب جاوااسکریپت متوجه شود که کوتیشنهای درون استرینگ مربوط به خود متن بوده و به معنای پایان استرینگ نیستند:
var myQuote = "A wise man once said: \"Don't waste your life thinking what others think about you\". True Words!";
alert (myQuote);
اگر کد بالا را در کنسول جاوااسکریپت کروم اجرا کنید، خواهید دید که پیام بدون هیچ خطایی اجرا خواهد شد.
فانکشنهای مرتبط با دیتا تایپ استرینگ
جاوااسکریپت شامل تعداد زیادی از فانکشنهای کاربردیِ از پیش تعریفشده برای کار با استرینگها است که در ادامه برخی از پرکاربردترین آنها را بررسی خواهیم کرد.
- ()charAt: این فانکشن کاراکتری که در یک مکان مشخص وجود دارد را برمیگرداند اما توجه کنید که شمارش کاراکترها از صفر شروع میشود:
var littleString = 'JavaScript is Fun!';
littleString.charAt(4); //returns "S"
همانطور که گفتیم، شمارش کاراکترها از صفر شروع میشود و از همین روی در کلمهٔ اول (JavaScript) حرف «J» دارای اندیس صفر، حرف «a» دارای اندیس یک و حرف «v» دارای اندیس دو است (با کمی دقت متوجه میشویم که برای به کار بردن این فانکشنها، باید ابتدا متغیر را تعریف کنیم و سپس با استفاده از نام متغیر و یک نقطه، فانکشن ()charAt
را اصطلاحا Call کنیم.)
- ()concat: نام این فانکشن از واژهٔ Concatenate به معنی «الحاق» گرفته شده است و این کاربرد را دارا است تا یک یا چند استرینگ را به هم بچسباند:
var littleString = 'JavaScript is Fun!';
littleString.concat(' We love JavaScript!'); //returns "JavaScript is Fun! We love JavaScript!"
- ()indexOf: این فانکشن در استرینگ جستجو کرده و اولین خانهای که عبارت جستجوشده در آن رخ داده را نمایش میدهد:
var littleString = 'JavaScript is Fun!';
littleString.indexOf('Fun'); //returns 14
- ()split: این فانکشن استرینگ را به آرایه یا مجموعهای از استرینگهای کوچکتر تبدیل میکند:
var littleString = 'JavaScript is Fun!';
littleString.split('F'); //returns ["JavaScript is ", "un!"]
حال فرض کنید که میخواهیم برای فانکشن ()split
از کاراکتر اسپیس (فاصله) استفاده کنیم که در میان کلمات استرینگ ما وجود دارد. همانطور که گفته شد، خود کاراکتر مورد هدف (یعنی اسپیس) حذف میشود. نکتهٔ دیگری که در اینجا وجود دارد، آن است که در این استرینگ دو کاراکتر اسپیس وجود دارد، یکی میان «JavaScript» و «is» و دیگری میان «is» و «!Fun» و اگر کاراکتر اسپیس را در فانکشن ()split
به کار ببریم، جاوااسکریپت تمامی مواردی که از آن کاراکتر یا عبارت را پیدا کند، در فانکشن به کار خواهد گرفت:
var littleString = 'JavaScript is Fun!';
littleString.split(' '); //returns ["JavaScript", "is", "Fun!"]
- ()substr: این فانکشن بخشی از استرینگ را جدا کرده و یک استرینگ کوچکتر (Substring) تولید میکند و این در حالی است که ()substr
به دو مقدار نیاز دارد که یکی مکان شروع برای جدا کردن و دیگری طول استرینگی است که باید جدا شود:
var littleString = 'JavaScript is Fun!';
littleString.substr(4, 6); //returns "Script"
همانطور که میبینیم، عدد اول در این فانکشن مکان شروع برای عملیات جداسازی را تعیین میکند که در اینجا اندیس 4 به مکان کاراکتر "S" اشاره میکند (اندیسها از شمارهٔ 0 شروع میشوند.) سپس این فانکشن از ما میخواهد که طول ساباسترینگی که باید جدا کند را وارد کنیم که عدد دوم، یعنی 6، به این فانکشن میگوید که از اندیس 4 به میزان 6 خانه جدا کند و نتیجهٔ نهایی عبارت «Script» خواهد بود.
- ()substring: این فانکشن بخشی از یک استرینگ که در میان دو اندیس مشخص قرار دارند را جدا میکند:
var littleString = 'JavaScript is Fun!';
littleString.substring(3, 6); //returns "aSc"
در اینجا، عدد اولی که در فانکشن ()substring
قرار دادیم (3) مکان کاراکتر «a» را مشخص میکند و عدد دوم (6) نیز مکان کاراکتر «r» را مشخص میسازد. حال فانکشن ()substring
عبارتی که میان این دو نقطه وجود دارد را جدا کرده و آن را به صورت یک ساباسترینگ نمایش میدهد (با کمی دقت هم متوجه میشویم که با وجود استفاده از مکان کاراکتر «r-» که اندیس 6 را دارا است، خود کاراکتر در نتیجه نهایی آورده نمیشود و ساباسترینگ نهایی تا ابتدای آن اندیس حساب میشود.)
- ()toLowerCase: این فانکشن استرینگ مورد نظر را گرفته و تمامی حروف آن را به حروف کوچک تبدیل میکند:
var littleString = 'JavaScript is Fun!';
littleString.toLowerCase(); //returns javascript is fun!
- ()toUpperCase: این فانکشن تمامی حروف استرینگ را به حروف بزرگ تبدیل میکند:
var littleString = 'JavaScript is Fun!';
littleString.toUpperCase(); //returns JAVASCRIPT IS FUN!
دیتا تایپ بولیَن (منطقی)
این دیتا تایپ تنها میتواند دو مقدار true
و false
داشته باشد (به خاطر داشته باشید واژهٔ Boolean بر اساس نام George Boole انتخاب شده که این فرد مخترع یک سیستم جبری و منطقی بوده است و از آنجایی که این عبارت از روی یک نام خاص انتخاب شده، معمولاً آن را با حرف اول بزرگ و به صورت Boolean مینویسیم.)
از متغیرهای بولیَن برای ذخیرهٔ نتایج مقایسهها و دیگر محاسبات منطقی که در آخر به یک جواب «بله/خیر» یا «درست/غلط» ختم میشوند استفاده میکنیم. برای آنکه بتوانیم مقدار بولیَن یک مقایسه را پیدا کنیم، یا آنکه هر مقدار در جاوااسکریپت را به دادهٔ بولیَن تبدیل کنیم، باید از فانکشن ()Boolean
استفاده کنیم:
var isItBigger = Boolean (3 > 20);
alert (isItBigger); //returns false
var areTheyTheSame = Boolean ("tiger" == "Tiger");
alert (areTheyTheSame); //returns false
در مثال اول، متغیر isItBigger
با مقدار بولیَن مقایسهٔ بین دو عدد 3 و 20 مقداردهی میشود که در این مقایسه گفته شده «آیا عدد 3 از 20 بزرگتر است یا خیر؟» سپس جواب این مقایسه به صورت بولیَن درآمده و در متغیر ما ذخیره میشود. در مثال دوم، دو استرینگ tiger
و Tiger
با هم مقایسه میشوند و نتیجهٔ درستی/نادرستی آن به صورت بولیَن در متغیر areTheyTheSame
ذخیره میگردد (توجه داشته باشید که برای بیان شرط برابری دو عبارت از عملگر =
استفاده نکردیم بلکه دو علامت مساوی را پشت سر هم به صورت ==
قرار دادیم. همانطور که در گذشته گفته شد، یک مساوی عملگر انتساب بوده و نمیتواند برای برابر بودن دو چیز به کار گرفته شود.)
اساساً نتیجهٔ استفاده از فانکشن ()Boolean
و تبدیل عبارات به دیتا تایپ بولیَن با توجه به نوع عبارت متفاوت است. در جاوااسکریپت، مقادیر زیر همواره دارای مقدار false
هستند:
- NaN
- undefined
- 0
- 0 -
- " "
- false
هر مقداری که از موارد بالا نباشد، همواره بولیَن true
را ریترن میکند به طوری که داریم:
- 86
- "Porsche"
- "34"
- "NaN"
همچنین توجه داشته باشیم که کاراکتر عددی "0" با مقدار عددی 0 برابر نیست و با آنکه بولیَن عدد صفر همیشه مقدار false
را برمیگرداند، اما جواب تبدیل استرینگ "0" به بولیَن همیشه true
است.
کاربرد اصلی متغیرهای بولیَنی بیشتر در عبارات و کدهای شرطی است. مثلاً برنامهٔ زیر یک متغیر بولیَن ساخته سپس مقدار آن را با استفاده از دستور شرطی if
بررسی میکند:
var b = true;
if (b == true) {
alert ("It is true!");
} else {
alert ("It is false!");
}
توجه داشته باشیم که برای نوشتن مقادیر بولیَن نباید از کوتیشن استفاده کرد چرا که true
و false
جزو کلمات رزروشدهٔ جاوااسکریپت بوده و نیازی به کوتیشن ندارند:
var myFriend = true;
var myEnemy = false;
در صورتی که در اطراف مقادیر بولیَن کوتیشن بگذاریم (مثلاً "true") آن وقت جاوااسکریپت این مقدار را به عنوان یک استرینگ (متن) میشناسد.
همانطور که پیش از این هم اشاره کردیم، NaN مخفف عبارت Not a Number است اما پرسش کلیدی اینجا است که «NaN چه زمانی رخ میدهد؟» در زمانهایی که بخواهیم بر روی استرینگها اعمال ریاضیاتی مانند ضرب، تقسیم، به توان رساندن و ... انجام دهیم، نتیجهای که جاوااسکریپت به ما نشان میدهد NaN خواهد بود مضاف بر اینکه اگر یک محاسبه ریاضیاتی قابلانجام نباشد و یا به هر دلیل با خطا روبهرو شود، جاوااسکریپت عبارت NaN را نمایش خواهد داد. برای مثال، میدانیم که اعداد منفی جذر ندارند و در صورتی که چنین معادلهای را از جاوااسکریپت بخواهیم، نتیجهٔ نهایی NaN خواهد بود:
Math.sqrt(-1) //returns NaN
همانطور که در مثال فوق می بینیم، متد ()sqrt
کلاس Math
جاوااسکریپت جذر هر عددی که به عنوان ورودی آن در نظر گرفته شود را برمیگرداند. در این مثال، ما یک عدد منفی را به عنوان پارامتر ورودی در نظر گرفتهایم و خواهیم دید که این فانکشن مقدار NaN را باز میگرداند. در همین راستا، یکی از فانکشنهای از پیش تعریفشده در زبان جاوااسکریپت ()isNaN
است که چک میکند ببیند که آیا پارامتر ورودی آن از جنس NaN است یا خیر و در صورتی که مقدار پارامتر ورودی NaN بود، مقدار true
و در غیر این صورت مقدار false
را باز میگرداند:
isNaN("stringOne" * "stringTwo") //returns true
در مثال فوق میبینیم که خروجی این فانکشن true
است چرا که استرینگهای stringOne و stringTwo را در یکدیگر ضرب کردهایم که از دید منطقی حاصلضرب این دو استرینگ NaN است. علاوه بر این، در برخی موارد جاوااسکریپت به جای NaN از null
استفاده میکند که عملاً همان مفهوم را دارد. null
نشانگر آن است که نتیجهٔ نهایی و یا عبارت مورد نظر از جنبهٔ معنایی تهی و بدون نامفهوم است.
به خاطر داشته باشید از آنجایی که جاوااسکریپت یک زبان حساس به بزرگی و کوچکی حروف است، نوع دادهای null
با عباراتی مثل Null یا NULL یا هر نوع نوشتاری دیگر متفاوت است. فرض کنید که یک متغیر ساده در جاوااسکریپت ساختهایم اما هیچ مقداری را به آن اختصاص ندادهایم و آن را خالی رها کردهایم. با وجود آنکه این متغیر از نظر ما خالی است، اما باز هم مقداری در آن وجود دارد که این مقدار همان undefined
است (به خاطر داشته باشید واژهٔ انگلیسی Define به معنی «تعریف کردن چیزی» است و پیشوند un در ابتدای این فعل و پسوند ed در انتها آن را به یک صفت تبدیل ساخته که معنای آن «تعریفنشده» است.) برای روشنتر شدن این مسئله، مثال زیر را مد نظر قرار میدهیم:
var myVariable;\
if (myVariable === undefined) {
message = "myVariable is undefined";
} else {
message = "myVariable is defined";
}
همانطور که در مثال فوق مشاهد میکنیم، متغیری ساختهایم تحت عنوان myVariable
اما هیچگونه مقداری به آن اختصاص ندادهایم. سپس از یک دستور شرطی استفاده کردهایم با این مضمون که اگر مقدار متغیر myVariable
مساوی با دیتا تایپ undefined
بود، استرینگ «myVariable is undefined» را به متغیری تحت عنوان message
اختصاص دهد و در غیر این صورت مقدار «myVariable is defined» به این متغیر اختصاص یابد. به هر حال، از آنجا که متغیر myVariable
تعریف شده اما هیچ مقداری به آن اختصاص نیافته است، دستور شرطی برنامهٔ ما وارد بلوک else
خواهد شد.
آشنایی با اپراتور typeof
این اپراتور یک استرینگ باز میگرداند که نشانگر تایپ (نوع) عملوند قرار گرفته پس از آن است. در جدول زیر، لیستی از مقادیر رایجی که اپراتور typeof
میتواند بازگرداند را مشاهده میکنیم:
تایپ | خروجی |
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol | "symbol" |
Function object | "function" |
به خاطر داشته باشید در برنامهنویسی اصطلاح Operant (عملوند) به هر چیزی اطلاق میگردد که بتوان محاسباتی یا کاری روی آن انجام داد. به طور مثال، در دستور 2 + 1، اعداد 1 و 2 عملوند هستند و علامت + هم Operator (عملگر) نامیده میشود. به منظور آشنایی بیشتر با اپراتور typeof
توجه شما را به چند مثال زیر جلب میکنیم:
// Numbers
typeof 37 === 'number';
// Strings
typeof "SokanAcademy.com" === 'string';
// Booleans
typeof true === 'boolean';
// Symbols
typeof Symbol() === 'symbol'
// Objects
typeof new Date() === 'object';
// Functions
typeof function(){} === 'function';
// Undefined
typeof undefined === 'undefined';
کلیهٔ این توضیحات را ارائه کردیم تا به مثال آخر برسیم! در واقع، در مثال فوق به جای دستور myVariable === undefined
میتوان از اپراتور typeof
نیز به شکل زیر استفاده کرد:
var myVariable;
if (typeof myVariable === 'undefined') {
message = "myVariable is undefined";
} else {
message = "myVariable is defined";
}
حال ممکن است این سوال پیش بیاید که «مزیت استفاده از اپراتور typeof
به این شکل در دستورات شرطی چیست؟» که در پاسخ به چنین سؤالی باید گفت اگر متغیر مد نظری که پس از typeof
استفاده میشود پیش از این تعریف نشده باشد، مفسر جاوااسکریپت ارور نمیدهد. برای روشنتر شدن این مسئله، به دو مثال زیر توجه کنید:
// myVariable has not been declared before
if (typeof myVariable === 'undefined') { // evaluates to true without errors
message = "myVariable is undefined";
} else {
message = "myVariable is defined";
}
if (myVariable === undefined) { // throws a ReferenceError
message = "myVariable is undefined";
} else {
message = "myVariable is defined";
}
همانطور که در مثال فوق میبینیم، متغیر myVariable
تعریف نشده اما در دستورات شرطی مورد استفاده قرار گرفته است. اگر دستور شرطی اول را اجرا کنید، برنامه به درستی اجرا شده و نتیجه در معرض دید ما قرار میگیرد اما اگر دستور شرطی دوم را اجرا کنید، ارور دریافت خواهید کرد!
دیتا تایپ آبجکت
زبان برنامهنویسی جاوااسکریپت یک زبان Object-oriented یا «شییٔگرا» است بدان معنا که آبجکتها بخش اصلی آن را تشکیل میدهند و به نوعی هستهٔ اصلی جاوااسکریپت محسوب میشوند به طوری که میتوان گفت اگر بتوانیم بر مفهوم و کاربرد آبجکتها در جاوااسکریپت مسلط شویم، تقریباً بر بخش عظیمی از این زبان تسلط پیدا کردهایم.
اگر بخواهیم آبجکتها را به شکلی ساده بیان کنیم، میتوان گفت که یک آبجکت (شییٔ) مجموعهای از سایر دیتا تایپها است که به صورت خاصی تعریف و فراخوانی میشود که به منظور درک بهتر «نوع خاصی از تعریف»، ابتدا یک مثال از دنیای واقعی میزنیم:
در دنیای واقعی، خودروی کامارو اصطلاحاً یک آبجکت (شییٔ) است و کامارویی که در تصویر فوق مشاهده میکنیم، دارای یکسری Property (مشخصه) همچون رنگ، سال تولید، قدرت موتور و ... است اما علاوه بر این پراپرتیها، دارای یکسری عملکرد نیز هست که تحت عنوان Method (متد) شناخته میشوند که از آن جمله میتوان به ترمز کردن، روشن شدن، گاز دادن و ... اشاره کرد.
در دنیای واقعی تمامی خودروها کمابیش از پراپرتیهای یکسانی برخوردارند به طوری که مثلاً هر خودرویی دارای رنگ، سال تولید، قدرت موتور و ... است اما این در حالی است که Value (مقدار) این پراپرتیها از خودرویی به خودروی دیگر متفاوت است به طوری که مثلاً رنگ این کامارو سفید است و مدل 2016 است اما یک خودروی دیگر ممکن است زرد رنگ بوده و سال تولید آن 2019 باشد. علاوه بر این، تمامی خودروها از متدهای کمابیش یکسانی برخوردارند چرا که هر خودرویی میتواند روشن شود، خاموش شود، ترمز کند و ... اما در عین حال سازوکار اجرای این متدها از خودرویی به خودروی دیگر متفاوت است.
با این مثال، حال قصد داریم تا مفهوم آبجکت را در زبان برنامهنویسی جاوااسکریپت بررسی کنیم. پیش از این با مفهوم متغیرها آشنا شدیم و نیاز به یادآوری است که آبجکتها هم نوعی متغیر هستند با این تفاوت که میتوانند چندین Value (مقدار) را در خود ذخیره سازند. همچون مثال کامارو، درون یک آبجکت هم اعضایی به نام Property وجود دارند که حتماً دارای نام و مقدار (هر دو با هم) هستند و مقدار یک پراپرتی میتواند یک متغیر دیگر یا یک فانکشن و یا حتی یک آبجکت دیگر باشد و به دلیل انعطافپذیری بسیار بالا، کارهایی که میتوان با آبجکتها و به طور کلی زبانهای برنامهنویسی شییٔگرا کرد گسترده است.
در زبان برنامهنویسی جاوااسکریپت راههای مختلفی برای ساخت آبجکت وجود دارد که برای نمونه، تکه کد زیر یک آبجکت ساده را به سادهترین شکل ممکن با استفاده از علائم { }
ایجاد میکند:
var myCar = {
name: "Camaro",
type: "Chevy",
year: 2016,
color: "White"
};
توجه داشته باشیم که در ساخت آبجکتها خطوط جدید و اِسپیسها مهم نیستند. به عبارت دیگر، کد بالا با کد زیر هیچ تفاوتی در عمل ندارد:
var myCar = {name: "Camaro", type: "Chevy", year: 2016, color: "White"};
همانطور که گفته شد، آبجکتها از اعضایی به نام پِراپِرتی یا «مشخصه» تشکیل میشوند و این مشخصهها حتماً میباید دارای یک جفت اطلاعات Name:Value (نام:مقدار) باشند. در این مثال، یک آبجکت داریم تحت عنوان myCar
که دارای چهار پِراپِرتی است؛ پِراپِرتی اول به نام name
مقدار استرینگ «Camaro» را دارد، پِراپِرتی دوم به نام type
مقدار استرینگ «Chevy»را در خود ذخیره کرده است، پِراپِرتی سوم year
است که مقدار عددی 2016 را داشته و در نهایت به مقدار color
میرسیم که مقدار استرینگ «White» را ذخیره ساخته است.
حال ممکن است این پرسش پیش بیاید که به چه شکل میتوان به بخشهای مختلف این آبجکت دسترسی پیدا کرد. برای این منظور، دو روش پیش روی ما است که در روش اول نام آبجکت را نوشته یک .
قرار میدهیم سپس نام پراپرتی مد نظر را مینویسیم:
myCar.name
در روش دوم، نام آبجکت را مد نظر را نوشته، مقابل آن علائم [ ]
را میگذاریم، سپس پراپرتی مد نظر خود را به عنوان پارامتر ورودی در نظر میگیریم:
myCar["name"]
هر دو روش فوق، مقدار مرتبط با پراپرتی name
که برابر با استرینگ «Camaro» است را باز میگردانند.
پیش از این هم گفتیم که منظور از Method کارهایی است که یک آبجکت میتواند انجام دهد. در مثال، فوق میتوانیم یکسری متد فرضی برای خودروی کاماروی خود در نظر بگیریم:
myCar.start();
myCar.stop();
myCar.drive();
myCar.brake();
همانطور که در کد فوق ملاحظه میشود، آبجکت myCar
ما یکسری کارهایی را هم میتواند انجام دهد یا به عبارتی یکسری متد دارد که از آن جمله میتوان به متد ()start
اشاره کرد. به طور کلی، آبجکتها همانند لیستی هستند که چندین آیتم مختلف و یا حتی لیستهای دیگر در آنها قرار میگیرند.
دیتا تایپ سیمبول
زبانی از نوع زبانهای اسکریپتینگ وجود دارد تحت عنوان ECMAScript که یک زبان استاندارد است که تمامی مرورگرها از آن پشتیبانی میکنند و زبانهایی همچون JavaScript ،JScript و ActionScript نمونههایی از زبانهایی هستند که از روی ECMAScript پیادهسازی شدهاند.
در نسخهٔ ECMAScript 6.0 که در ماه ژوئن سال 2015 به دنیا عرضه شد، شاهد یکسری ویژگیهای جدیدی هستیم که از آن جمله میتوان به دیتا تایپ Symbol اشاره کرد (در همین راستا، توصیه میکنیم به مقالهٔ آموزش 10 ترفند کاربردی در جاوااسکریپت نسخهٔ ES6 به همراه مثال مراجعه نمایید.) جهت ساخت یک متغیر از جنس سیمبول، به صورت زیر عمل میکنیم:
var mySymbol = Symbol();
در نمونه کد فوق، متغیری داریم تحت عنوان mySymbol
که تایپ آن از نوع دیتا تایپ ()Symbol
است. اگر خیلی ساده بخواهیم بگوییم که این دیتا تایپ چه وظیفهای بر عهده دارد، میتوان گفت زمانهایی که بخواهیم برخی پراپرتیهای آبجکتها منحصربهفرد بوده، از بین نروند و از همه جای اپلیکیشن در دسترسی باشند، از سیمبولها استفاده میکنیم.