
در جاوااسکرپیت میشود درون یک متغیّر هر نوع مقداری نگه داشت. مقدار متغیر ممکن است در یک لحظه «متن» باشد و در لحظهای دیگر «عدد»، مثل این:
// کد زیر خطا نخواهد داد
let message = "سلام";
message = 123456;
به زبانهای برنامهنویسی دارای این قابلیت، زبانهای «dynamically type» گفته میشود. در این زبانها مقادیر دارای نوع هستند (مثلاً متن، عدد یا چیز دیگری هستند)، ولی خود متغیّرها نوع ندارند، یعنی برای متغیّر اصلاً مهم نیست چه نوع مقداری درونش ذخیره میشود.
هفت نوع مقدار در جاوااسکریپت وجود دارد. در این آموزش به طور کلّی با این هفت تا آشنا میشویم. بعد در قسمتهای بعدی موشکافانهتر این هفت تا را مورد بررسی قرار خواهیم داد. به این هفت نوع اصطلاحاً «دیتاتایپ – data type» گفته میشود.
عدد – number
let n = 123;
n = 12.345;
در جاوااسکریپت تمام اعداد از نوع number محسوب میشوند، چه عدد صحیح باشند، چه اعشاری.
کارهای زیادی میشود با اعداد انجام داد، مثل ضرب *
، تقسیم /
، جمع +
، تفریق -
و غیره.
علاوه بر اعداد معمولی، «مقادیر عددی خاص» هم از نوع number محسوب میشوند: Infinity
، -Infinity
و NaN
.
Infinity
به معنی بینهایت (∞) در ریاضی است. بینهایت عددی خاص است که از تمام اعداد معمولی بزرگتر است.
حاصل تقسیم اعداد بر صفر میشود بینهایت:
alert( 1 / 0 ); // Infinity
کلمهی Infinity
مستقیماً نیز قابل تایپ است:
alert( Infinity ); // Infinity
NaN
نشاندهندهی خطای محاسباتی است. اگر نتیجهی یک عبارت ریاضی اشتباه باشد، یا تعریفنشده باشد، خروجیNaN
خواهد بود.
alert( "ناعدد" / ۲ ); // چنین تقسیمی اشتباه است، NaN
اگر در جایی از یک عبارت ریاضی NaN
داشته باشیم، خروجی کلّ آن عبارت ریاضی قطعاً NaN
خواهد شد:
alert( "ناعدد" / ۲ + ۵ ); // NaN
عبارات ریاضی بیخطر هستند
در جاوااسکریپت هر طور عبارت ریاضی بنویسید بیخطر است. مثلاً عددی را تقسیم بر صفر کنید، به جای نوشتن عدد متن بنویسید و غیره.
اسکریپت با این اتّفاقات دچار خطای مخرّب نخواهد شد (خطایی که باعث توقّف اجرای کد شود). در بدترین حالت فقط خروجی عبارت ریاضیتان NaN
خواهد شد.
مقادیر عددی خاص هم از نوع number به حساب میآیند، هرچند که در دنیای واقعی به چنین چیزهایی «عدد» نمیگوییم.
در قسمت «اعداد» بیشتر با عددها در جاوااسکریپت کار خواهیم کرد.
رشته – string
به صورت کلی در برنامهنویسی هرگاه بخواهیم متنی در کد بنویسیم، به جای کلمهی «متن» از کلمهی «رشته» استفاده میکنیم که معادل انگلیسی اش میشود string. زیرا هر متنی را میتوان رشتهای از کاراکترها در نظر گرفت.
در جاوااسکریپت باید رشتهها را درون کوتیشن بنویسید.
let str = "سلام";
let str2 = 'تک کوتیشین هم میشود نوشت';
let phrase = `جاسازی هم میشود کرد ${str}`;
در جاوااسکریپت سه نوع کوتیشن وجود دارد.
- جفت کوتیشن (double quote):
"سلام"
. - تک کوتیشن (single quote):
'سلام'
. - بک تیک (Backtick):
`سلام`
.
جفت کوتیشن و تک کوتیشن ساده محسوب میشوند، و در جاوااسکریپت فرقی با هم ندارند.
بک تیک دارای قابلیتهای بیشتری نسبت به کوتیشن ساده است. با بک تیک میتوانید متغیّر یا عبارتی دیگر را درون رشتهی مورد نظر خود جاسازی کنید. مثلاً:
let name = "مجتبی";
// جاسازی متغیّر
alert( `سلام ${name}!` ); // سلام مجتبی!
// جاسازی یک عبارت
alert( `نتیجه میشود ${۱ + ۲}` ); // نتیجه میشود ۳
عبارتی که درون ${...}
نوشته میشود، مقدارش محاسبه شده، جایگزین شده و جزو رشته محسوب میشود. میشود هر چیزی درون این آکولاد نوشت: یک متغیّر مثل name
یا عبارتی ریاضی مثل ۱ + ۲
یا چیزهای پیچیدهتر.
حواستان باشد این قابلیت فقط متعلق به بک تیک است، کوتیشن ساده چنین قابلیتی ندارد!
// جفت کوتیشن کار خاص نمیکند
alert( "نتیجه میشود ${۱ + ۲}" ); // نتیجه میشود ${۱ + ۲}
در آموزشهای بعدی بیشتر در مورد رشتهها صحبت میکنیم.
نوع مجزّایی برای کاراکتر در جاوااسکریپت نداریم.
در بعضی زبانهای برنامهنویسی، دیتاتایپ خاصی تحت عنوان «کاراکتر» هم وجود دارد که برای نگهداری تنها یک کاراکتر به کار میرود، مثلاً در زبان C و Java این دیتاتایپ خاص char نامیده میشود.
ولی در جاوااسکریپت چنین دیتاتایپی وجود ندارد. برای متن، تنها دیتاتایپ رشته (string) را داریم و دیگر هیچ. حالا این رشته ممکن است یک کاراکتر داشته باشد یا بیشتر.
بولین – boolean (نوع منطقی)
نوع بولین تنها دارای دو مقدار خاص true و false است.
هدف این نوع مقدار، ذخیرهسازی چیزهایی است که حالت «بله»/«خیر» دارند. true
یعنی «بله» یا «درست». false
یعنی «خیر» یا «نادرست». مثلاً:
let nameFieldChecked = true; // بله، بررسی شده است
let ageFieldChecked = false; // نه، سن کاربر بررسی نشده است
همیشه نتیجهی هر مقایسه یک بولین است:
let isGreater = 4 > 1;
alert( isGreater ); // true (نتیجهی مقایسه «بله» است)
در بخش عملگرهای منطقی بولینها را عمیقتر مورد بررسی قرار میدهیم.
مقدار null
مقدار خاص null
جزء هیچ کدام از دیتاتایپهایی که تا به حال گفتیم نیست.
null
دیتاتایپ مخصوص به خودش را دارد. این دیتاتایپ، فقط شامل null
میشود و دیگر هیچ:
let age = null;
برعکس بعضی از زبانها، در جاوااسکریپت این طور نیست که null
«ارجاعی به یک شیء ناموجود» باشد. یا اینکه «اشارهگر خالی» باشد.
null
یک نوع خاص است که نشاندهندهی «پوچ»، «خالی بودن»، یا «مقداری ناشناخته» است.
مثال بالا نشان میدهد متغیّر age
در آن حالت مقدارش خالی است یا به هر دلیلی مشخّص نیست (ناشناخته است).
مقدار undefined
مقدار خاص undefined
نیز به تنهایی یک دیتاتایپ خاص را تشکیل میدهد. درست مثل null
.
معنی undefined
میشود «مقدار داده نشده».
اگر متغیّری ساخته شود، ولی مقداری در آن ریخته نشود، مقدارش undefined
است:
let x;
alert(x); // "undefined"
البته از لحاظ فنی میشود به صورت دستی هم undefined
را درون یک متغیّر ریخت:
let x = 123;
x = undefined;
alert(x); // "undefined"
ولی چنین کاری نکنید! برای این که نشان دهید متغیّر «خالی» یا «پوچ» یا «ناشناخته» است، از null
استفاده کنید. undefined
را بگذارید بماند برای وقتی که میخواهید بررسی کنید در متغیّر مورد نظرتان چیزی ریخته شده است یا نه.
شیء و سمبل – object و symbol
نوع شیء (object
) خیلی خاص است.
تمام دیتاتایپهایی که تا به حال با آنها آشنا شدیم، دیتاتایپهای اصلی (Primitive) بودند. زیرا در همهی آن موارد فقط یک چیز بود که ذخیره میشد (مثلاً یک رشتهی ساده، یک عدد یا…). ولی object در مواردی استفاده میشود که بخواهیم مجموعهای از اطّلاعات را نگهداری کنیم. در بخش «اشیاء» در مورد object بیشتر صحبت خواهیم کرد.
هدف نوع symbol
ایجاد شناسهی منحصر به فرد برای استفاده در اشیاء است. البته الآن فقط به خاطر کامل شدن مطلب به این نوع هم اشاره کردیم. بعداً با آنها بیشتر آشنا خواهیم شد.
عملگر typeof
عملگر typeof نوع مقادیر مورد نظر را به ما میدهد. اگر بخواهید دیتاتایپ متغیّری را بررسی کنید، و بر اساس نوعش کار متفاوتی بکنید این عملگر به کارتان میآید.
به دو شکل میتوان از این عملگر استفاده کرد:
- به شکل عملگر:
typeof x
. - به شکل تابع:
typeof(x)
.
به عبارتی دیگر برای typeof
چه پرانتز بگذارید چه نگذارید فرقی نمیکند و خروجی یکسان است.
خروجی typeof x
رشتهای است که دیتاتایپ مورد نظر را نشان میدهد:
typeof undefined // "undefined"
typeof 0 // "number"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
باید دربارهی سه خط آخر توضیحاتی بدهیم:
Math
یک شیء است که از ابتدا در جاوااسکریپت وجود دارد. این شیء به ما امکان میدهد یک سری کارهای ریاضیاتی را انجام دهیم. با شیء Math در قسمت «اعداد» بیشتر آشنا میشویم. در این جا فقط به عنوان یک مثال برای object آن را نوشتیم.- خروجی
typeof null
میشودobject
. ولی این نادرست است. اگرtypeof
دارد خروجی نادرست میدهد به این دلیل است که میخواهد سازگاریاش را با جاوااسکریپت قدیمی حفظ کند. وگرنهnull
شیء نیست. باز هم تکرار میکنم این اشتباه زبان جاوااسکریپت است. - خروجی
typeof alert
میشودfunction
. زیراalert
یک function است. در قسمت بعدی در مورد functionها صحبت خواهیم کرد. function در اصل زیرمجموعهای از objectهاست. ولیtypeof
آن را به صورت نوعی مجزّا نشان میدهد. اگرچه این خروجی دقیق نیست، ولی خیلی وقتها کار را سادهتر میکند.
خلاصهی مبحث دیتاتایپ
هفت دیتاتایپ در جاوااسکریپت وجود دارد.
- عدد (number) برای اعداد، هم اعداد اعشاری و هم صحیح.
- رشته (string) برای متن. رشته ممکن است تک کاراکتری باشد یا نباشد، نوعی مجزّا برای کاراکتر در جاوااسکریپت وجود ندارد.
- بولین (boolean) برای نشان دادن مقادیر منطقی
true
/false
- null: نوعی که فقط دارای مقدار خاص
null
است و نشاندهندهی خالی بودن یا ناشناخته بودن است. - undefined: نوعی که فقط دارای مقدار خاص
undefined
است و نشاندهندهی این است که چیزی درون متغیّر مورد نظر نریختهایم. - شیء (object): برای ساختارهای اطّلاعاتی پیچیده.
- سمبل (symbol): برای شناسههای منحصر به فرد.
عملگر typeof
دیتاتایپ مقدار ذخیره شده در متغیّر را به ما بر میگرداند.
- دو حالت برای فراخوانی دارد:
typeof x
وtypeof(x)
- دیتاتایپ مقدار مورد نظر را در قالب رشته بر میگرداند، مثلاً
"string"
. - دیتاتایپ
null
را"object"
بر میگرداند. این اشتباهی در جاوااسکریپت است،null
شیء نیست.
در قسمتهای بعدی در مورد نوعهای اصلی عمیقتر بحث میکنیم. بعد سراغ مبحث اشیاء میرویم.