دیتاتایپ (Data type)

انواع مقادیر یا دیتاتایپ در جاوااسکریپت

در جاوااسکرپیت می‌شود درون یک متغیّر هر نوع مقداری نگه داشت. مقدار متغیر ممکن است در یک لحظه «متن» باشد و در لحظه‌ای دیگر «عدد»، مثل این:

// کد زیر خطا نخواهد داد
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}`;

در جاوااسکریپت سه نوع کوتیشن وجود دارد.

  1. جفت کوتیشن (double quote): "سلام".
  2. تک کوتیشن (single quote): 'سلام'.
  3. بک تیک (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 شیء نیست.

در قسمت‌های بعدی در مورد نوع‌های اصلی عمیق‌تر بحث می‌کنیم. بعد سراغ مبحث اشیاء می‌رویم.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *